home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / misc / amag / AM9411_6.lha / XASS 64 / XAss 1.0 / Source / CrossAss.c next >
C/C++ Source or Header  |  1994-10-18  |  93KB  |  3,351 lines

  1. /*************************************************************
  2.  *************************************************************
  3.  ****                                                     ****
  4.  ****   6 5 1 0  -  D e v e l o p e r s  -  P a c k e t   ****
  5.  ****                                                     ****
  6.  ****        C  R  O  S  S  A  S  S     V  1  .  0        ****
  7.  ****        -------------------------------------        ****
  8.  ****                                                     ****
  9.  ****         programmiert von Christian Krenner          ****
  10.  ****     (C)opyright 1992 Markt & Technik Verlag AG      ****
  11.  ****                                                     ****
  12.  *************************************************************
  13.  *************************************************************/
  14.  
  15. /************
  16.  * includes *
  17.  ************/
  18.  
  19. #include <exec/exec.h>
  20. #include <intuition/intuition.h>
  21. #include <libraries/dos.h>
  22. #include <libraries/dosextens.h>
  23. #include <ctype.h>
  24.  
  25. #include <dos/dosasl.h>
  26. #include <libraries/asl.h>
  27. #include <clib/asl_protos.h>
  28. #include <clib/dos_protos.h>
  29. #include <intuition/intuitionbase.h>
  30.  
  31. /*******************
  32.  * neue Strukturen *
  33.  *******************/
  34.  
  35. struct Label
  36. {
  37.    char name[32];
  38.    unsigned int wert;
  39.    unsigned int aufruf;
  40.    unsigned int macro;
  41. };
  42.  
  43. struct Macro
  44. {
  45.    char name[32];
  46.    char *source;
  47.    char paramcount;
  48.    unsigned long lenght;
  49.    unsigned int aufruf;
  50. };
  51.  
  52. struct MacroStack
  53. {
  54.    char *pointer;
  55.    char *endbuffer;
  56.    long actlenght;
  57.    char paramcount;
  58.    unsigned int params[10];
  59.    BOOL defd[10];
  60.    long lineafter;
  61.    unsigned int number;
  62.    unsigned int aufruf;
  63. };
  64.  
  65. struct IncludeStack
  66. {
  67.    char lastfile[256];
  68.    long lineafter;
  69. };
  70.  
  71. struct Block
  72. {
  73.    unsigned int begin;
  74.    unsigned int end;
  75.    char name[32];
  76.    unsigned int labels;
  77. };
  78.  
  79. struct Einstellungen
  80. {
  81.    unsigned long macromemlenght;
  82.    unsigned long macrotablelenght;
  83.    unsigned long labellenght;
  84.    unsigned int delay;
  85.    BOOL sort;
  86.    unsigned char converttable[256];
  87. };
  88.  
  89. /********************************
  90.  * globale Strukturen für Menüs *
  91.  ********************************/
  92.  
  93. struct TextAttr Font =
  94. { (STRPTR)"topaz.font", TOPAZ_EIGHTY, FS_NORMAL, FPF_ROMFONT };
  95. struct IntuiText DateiUebertragenText =
  96. { 0, 1, JAM2, 1, 1, &Font, (UBYTE *)"Übertragen", NULL };
  97. struct IntuiText DateiInformationText =
  98. { 0, 1, JAM2, 1, 1, &Font, (UBYTE *)"Über ...", NULL };
  99. struct IntuiText DateiEndeText =
  100. { 0, 1, JAM2, 1, 1, &Font, (UBYTE *)"Ende", NULL };
  101. struct IntuiText TabellenLabelsText =
  102. { 0, 1, JAM2, 1, 1, &Font, (UBYTE *)"Labels", NULL };
  103. struct IntuiText TabellenMakrosText =
  104. { 0, 1, JAM2, 1, 1, &Font, (UBYTE *)"Makros", NULL };
  105. struct IntuiText TabellenBloeckeText =
  106. { 0, 1, JAM2, 1, 1, &Font, (UBYTE *)"Blöcke", NULL };
  107. struct IntuiText TabellenMnemonicsText =
  108. { 0, 1, JAM2, 1, 1, &Font, (UBYTE *)"Mnemonics", NULL };
  109. struct IntuiText EinstAendernText =
  110. { 0, 1, JAM2, 1, 1, &Font, (UBYTE *)"Ändern", NULL };
  111. struct IntuiText EinstSpeichernText =
  112. { 0, 1, JAM2, 1, 1, &Font, (UBYTE *)"Speichern", NULL };
  113. struct IntuiText EinstLadenText =
  114. { 0, 1, JAM2, 1, 1, &Font, (UBYTE *)"Laden", NULL };
  115. struct IntuiText EinstKLadenText =
  116. { 0, 1, JAM2, 1, 1, &Font, (UBYTE *)"KonvTab laden", NULL };
  117. struct IntuiText DruckenSText =
  118. { 0, 1, JAM2, 1, 1, &Font, (UBYTE *)"Quelldatei", NULL };
  119. struct IntuiText DruckenLabelText =
  120. { 0, 1, JAM2, 1, 1, &Font, (UBYTE *)"Labels", NULL };
  121. struct IntuiText DruckenMakroText =
  122. { 0, 1, JAM2, 1, 1, &Font, (UBYTE *)"Makros", NULL };
  123. struct IntuiText DruckenBloeckeText =
  124. { 0, 1, JAM2, 1, 1, &Font, (UBYTE *)"Blöcke", NULL };
  125. struct MenuItem DruckenBloecke =
  126. { NULL, 1, 31, 152, 10, ITEMTEXT | COMMSEQ | HIGHCOMP | ITEMENABLED,
  127.   0L, (APTR)&DruckenBloeckeText, NULL, '1', NULL, 0, };
  128. struct MenuItem DruckenMakros =
  129. { &DruckenBloecke, 1, 21, 152, 10, ITEMTEXT | COMMSEQ | HIGHCOMP | ITEMENABLED,
  130.   0L, (APTR)&DruckenMakroText, NULL, '2', NULL, 0, };
  131. struct MenuItem DruckenLabels =
  132. { &DruckenMakros, 1, 11, 152, 10, ITEMTEXT | COMMSEQ | HIGHCOMP | ITEMENABLED,
  133.   0L, (APTR)&DruckenLabelText, NULL, '3', NULL, 0, };
  134. struct MenuItem DruckenSource =
  135. { &DruckenLabels, 1, 1, 152, 10, ITEMTEXT | COMMSEQ | HIGHCOMP | ITEMENABLED,
  136.   0L, (APTR)&DruckenSText, NULL, '4', NULL, 0, };
  137. struct MenuItem EinstKLaden =
  138. { NULL, 1, 31, 152, 10, ITEMTEXT | COMMSEQ | HIGHCOMP | ITEMENABLED,
  139.   0L, (APTR)&EinstKLadenText, NULL, 'K', NULL, 0, };
  140. struct MenuItem EinstLaden =
  141. { &EinstKLaden, 1, 21, 152, 10, ITEMTEXT | COMMSEQ | HIGHCOMP | ITEMENABLED,
  142.   0L, (APTR)&EinstLadenText, NULL, 'O', NULL, 0, };
  143. struct MenuItem EinstSpeichern =
  144. { &EinstLaden, 1, 11, 152, 10, ITEMTEXT | COMMSEQ | HIGHCOMP | ITEMENABLED,
  145.   0L, (APTR)&EinstSpeichernText, NULL, 'S', NULL, 0, };
  146. struct MenuItem EinstAendern =
  147. { &EinstSpeichern, 1, 1, 152, 10, ITEMTEXT | COMMSEQ | HIGHCOMP | ITEMENABLED,
  148.   0L, (APTR)&EinstAendernText, NULL, 'A', NULL, 0, };
  149. struct MenuItem TabellenMnemonics =
  150. { NULL, 1, 31, 152, 10, ITEMTEXT | COMMSEQ | HIGHCOMP | ITEMENABLED,
  151.   0L, (APTR)&TabellenMnemonicsText, NULL, 'N', NULL, 0, };
  152. struct MenuItem TabellenBloecke =
  153. { &TabellenMnemonics, 1, 21, 152, 10, ITEMTEXT | COMMSEQ | HIGHCOMP | ITEMENABLED,
  154.   0L, (APTR)&TabellenBloeckeText, NULL, 'B', NULL, 0, };
  155. struct MenuItem TabellenMakros =
  156. { &TabellenBloecke, 1, 11, 152, 10, ITEMTEXT | COMMSEQ | HIGHCOMP | ITEMENABLED,
  157.   0L, (APTR)&TabellenMakrosText, NULL, 'M', NULL, 0, };
  158. struct MenuItem TabellenLabels =
  159. { &TabellenMakros, 1, 1, 152, 10, ITEMTEXT | COMMSEQ | HIGHCOMP | ITEMENABLED,
  160.   0L, (APTR)&TabellenLabelsText, NULL, 'L', NULL, 0, };
  161. struct MenuItem DateiEnde =
  162. { NULL, 1, 21, 152, 10, ITEMTEXT | COMMSEQ | HIGHCOMP | ITEMENABLED,
  163.   0L, (APTR)&DateiEndeText, NULL, 'Q', NULL, 0, };
  164. struct MenuItem DateiInformation =
  165. { &DateiEnde, 1, 11, 152, 10, ITEMTEXT | COMMSEQ | HIGHCOMP | ITEMENABLED,
  166.   0L, (APTR)&DateiInformationText, NULL, '?', NULL, 0, };
  167. struct MenuItem DateiUebertragen =
  168. { &DateiInformation, 1, 1, 152, 10, ITEMTEXT | COMMSEQ | HIGHCOMP | ITEMENABLED,
  169.   0L, (APTR)&DateiUebertragenText, NULL, 'T', NULL, 0, };
  170. struct Menu MenuDrucken =
  171. { NULL, 314, 0, 88, 0, MENUENABLED, (BYTE *)" Drucken",
  172.   &DruckenSource };
  173. struct Menu MenuEinstellungen =
  174. { &MenuDrucken, 178, 0, 136, 0, MENUENABLED, (BYTE *)" Einstellungen",
  175.   &EinstAendern };
  176. struct Menu MenuTabellen =
  177. { &MenuEinstellungen, 82, 0, 96, 0, MENUENABLED, (BYTE *)" Tabellen",
  178.   &TabellenLabels };
  179. struct Menu MenuDatei =
  180. { &MenuTabellen, 10, 0, 72, 0, MENUENABLED, (BYTE *)" Datei",
  181.   &DateiUebertragen };
  182.  
  183. /**************************************
  184.  * globale Strukturen für Hauptwindow *
  185.  **************************************/
  186.  
  187. SHORT Werte1[] =
  188. { 0, 62, 0, 0, 376, 0 };
  189. SHORT Werte2[] =
  190. { 376, 1, 376, 62, 1, 62 };
  191. SHORT GWerte1[] =
  192. { 0, 11, 0, 0, 180, 0 };
  193. SHORT GWerte2[] =
  194. { 180, 1, 180, 11, 1, 11 };
  195. struct Border GadgetBorder2 =
  196. { 0, 0, 1, 0, JAM1, 3, GWerte2, NULL };
  197. struct Border GadgetBorder1 =
  198. { 0, 0, 2, 0, JAM1, 3, GWerte1, &GadgetBorder2 };
  199. struct Border Border2 =
  200. { 16, 24, 2, 0, JAM1, 3, Werte2, NULL };
  201. struct Border Border1 =
  202. { 16, 24, 1, 0, JAM1, 3, Werte1, &Border2 };
  203. struct IntuiText GadgetText2 =
  204. { 1, 0, JAM2, 62, 2, &Font, (UBYTE *)" Stop ", NULL };
  205. struct IntuiText GadgetText1 =
  206. { 1, 0, JAM2, 66, 2, &Font, (UBYTE *)"Start", NULL };
  207. struct IntuiText Text7 =
  208. { 3, 0, JAM2, 20, 76, NULL,
  209.   (UBYTE *)"                                             ", NULL };
  210. struct IntuiText Text6 =
  211. { 1, 0, JAM2, 20, 66, &Font,
  212.   (UBYTE *)"Zeile: 000000  Zeilen insg: 000000   Pass: -", &Text7 };
  213. struct IntuiText Text5 =
  214. { 1, 0, JAM2, 20, 56, &Font,
  215.   (UBYTE *)"Anzahl Symbole: 00000   Anzahl Makros: 00000", &Text6 };
  216. struct IntuiText Text4 =
  217. { 1, 0, JAM2, 20, 46, &Font,
  218.   (UBYTE *)"Code: $0000 - $0000     Länge: 00000 Byte", &Text5 };
  219. struct IntuiText Text3 =
  220. { 1, 0, JAM2, 20, 36, &Font,
  221.   (UBYTE *)"Objektdatei:                                 ", &Text4 };
  222. struct IntuiText Text2 =
  223. { 1, 0, JAM2, 20, 26, &Font, 
  224.   (UBYTE *)"Quelldatei:                                  ", &Text3 };
  225. struct IntuiText Text1 =
  226. { 3, 0, JAM2, 20, 14, &Font, (UBYTE *)"Status:", &Text2 };
  227. struct Gadget Gadget1 =
  228. { NULL, 114, 90, 181, 12, GADGHCOMP, RELVERIFY, BOOLGADGET,
  229.   &GadgetBorder1, NULL, &GadgetText1, NULL, NULL, 1, NULL };
  230. struct NewWindow MainNewWindow =
  231. { 116, 50, 408, 108, -1, -1, CLOSEWINDOW | GADGETUP | MENUPICK,
  232.   WINDOWDEPTH | WINDOWDRAG | WINDOWCLOSE | SMART_REFRESH | ACTIVATE,
  233.   &Gadget1, NULL, (UBYTE *)"CrossAss V1.0, © 1994 MagnaMedia Verlag AG",
  234.   NULL, NULL, 116, 50, 408, 140, WBENCHSCREEN };
  235.  
  236. /*****************************************
  237.  * globale Strukturen für Tabellenwindow *
  238.  *****************************************/
  239.  
  240. char TaText[15][51];
  241. struct IntuiText TaIntuiText[15];
  242. struct IntuiText TaTText =
  243. { 1, 0, JAM2, 8, 0, &Font, NULL, NULL };
  244. SHORT TaWerte1[] =
  245. { 0, 124, 0, 0, 404, 0 };
  246. SHORT TaWerte2[] =
  247. { 404, 1, 404, 124, 1, 124 };
  248. SHORT TaWerte3[] =
  249. { 0, 8, 0, 0, 20, 0 };
  250. SHORT TaWerte4[] =
  251. { 20, 1, 20, 8, 1, 8 };
  252. SHORT TaWerte5[] =
  253. { 0, 106, 0, 0, 20, 0 };
  254. SHORT TaWerte6[] =
  255. { 20, 1, 20, 106, 1, 106 };
  256. SHORT TaWerte7[] =
  257. { 4, 5, 11, 2, 17, 5 };
  258. SHORT TaWerte8[] =
  259. { 4, 3, 11, 6, 17, 3 };
  260. struct IntuiText TaText1 =
  261. { 3, 0, JAM2, 8, 12, &Font,
  262.   (UBYTE *)"                                                  ", NULL };
  263. struct Image TaImage1;
  264. struct Border TaBorder8 =
  265. { 0, 0, 1, 0, JAM1, 3, TaWerte8, NULL };
  266. struct Border TaBorder7 =
  267. { 0, 0, 1, 0, JAM1, 3, TaWerte7, NULL };
  268. struct Border TaBorder6 =
  269. { 415, 31, 1, 0, JAM1, 3, TaWerte6, NULL };
  270. struct Border TaBorder5 =
  271. { 415, 31, 2, 0, JAM1, 3, TaWerte5, &TaBorder6 };
  272. struct Border TaBorder4 =
  273. { 0, 0, 1, 0, JAM1, 3, TaWerte4, NULL };
  274. struct Border TaBorder3 =
  275. { 0, 0, 2, 0, JAM1, 3, TaWerte3, &TaBorder4 };
  276. struct Border TaBorder2 =
  277. { 6, 22, 2, 0, JAM1, 3, TaWerte2, &TaBorder5 };
  278. struct Border TaBorder1 =
  279. { 6, 22, 1, 0, JAM1, 3, TaWerte1, &TaBorder2 };
  280. struct PropInfo TaProp1 =
  281. { AUTOKNOB | FREEVERT | PROPBORDERLESS, 1, 1, 0x100, 0x100,
  282.   0, 0, 0, 0, 0, 0 };
  283. struct Gadget TaGadget3 =
  284. { NULL, 416, 32, 19, 105, GADGHCOMP, GADGIMMEDIATE | RELVERIFY, PROPGADGET,
  285.   &TaImage1, NULL, NULL, NULL, &TaProp1, 3, NULL };
  286. struct Gadget TaGadget2 =
  287. { &TaGadget3, 415, 138, 21, 9, GADGHCOMP, GADGIMMEDIATE | RELVERIFY, BOOLGADGET,
  288.   &TaBorder8, NULL, NULL, NULL, NULL, 2, NULL };
  289. struct Gadget TaGadget1 =
  290. { &TaGadget2, 415, 22, 21, 9, GADGHCOMP, GADGIMMEDIATE | RELVERIFY, BOOLGADGET,
  291.   &TaBorder7, NULL, NULL, NULL, NULL, 1, NULL };
  292. struct NewWindow TableNewWindow =
  293. { 95, 50, 441, 150, -1, -1, CLOSEWINDOW | GADGETUP | GADGETDOWN,
  294.   WINDOWDEPTH | WINDOWDRAG | WINDOWCLOSE | SMART_REFRESH | ACTIVATE,
  295.   &TaGadget1, NULL, (UBYTE *)"Tabellarische Übersicht",
  296.   NULL, NULL, 116, 50, 408, 140, WBENCHSCREEN };
  297.  
  298. /*********************************************
  299.  * globale Strukturen für Informationswindow *
  300.  *********************************************/
  301.  
  302. char ueberschrift[] = "           CrossAss Version 1.0";
  303. SHORT InfoWerte1[] =
  304. { 6, 52, 6, 15, 353, 15 };
  305. SHORT InfoWerte2[] =
  306. { 353, 16, 353, 52, 7, 52 };
  307. SHORT InfoWerte3[] =
  308. { 60, 85, 60, 55, 292, 55 };
  309. SHORT InfoWerte4[] =
  310. { 292, 56, 292, 85, 61, 85 };
  311. struct Border InfoBorder4 =
  312. { 0, 0, 2, 0, JAM1, 3, InfoWerte4, NULL };
  313. struct Border InfoBorder3 =
  314. { 0, 0, 1, 0, JAM1, 3, InfoWerte3, &InfoBorder4 };
  315. struct Border InfoBorder2 =
  316. { 0, 0, 1, 0, JAM1, 3, InfoWerte2, &InfoBorder3 };
  317. struct Border InfoBorder1 =
  318. { 0, 0, 2, 0, JAM1, 3, InfoWerte1, &InfoBorder2 };
  319. struct IntuiText InfoText7 =
  320. { 1, 0, JAM2, 8, 74, &Font,
  321.   (UBYTE *)"                                   ", NULL };
  322. struct IntuiText InfoText6 =
  323. { 1, 0, JAM2, 8, 66, &Font,
  324.   (UBYTE *)"                                   ", &InfoText7 };
  325. struct IntuiText InfoText5 =
  326. { 1, 0, JAM2, 8, 58, &Font,
  327.   (UBYTE *)"                                   ", &InfoText6 };
  328. struct IntuiText InfoText4 =
  329. { 3, 0, JAM2, 31, 42, &Font,
  330.   (UBYTE *)"(C)opyright 1994 MagnaMedia Verlag AG", &InfoText5 };
  331. struct IntuiText InfoText3 =
  332. { 3, 0, JAM2, 11, 32, &Font,
  333.   (UBYTE *)"    programmiert von Christian Krenner", &InfoText4 };
  334. struct IntuiText InfoText2 =
  335. { 2, 0, JAM1, 11, 18, &Font,
  336.   (UBYTE *)ueberschrift, &InfoText3 };
  337. struct IntuiText InfoText1 =
  338. { 3, 0, JAM2, 13, 19, &Font,
  339.   (UBYTE *)ueberschrift, &InfoText2 };
  340. struct NewWindow InfoNewWindow =
  341. { 136, 55, 360, 90, -1, -1, CLOSEWINDOW,
  342.   WINDOWDEPTH | WINDOWDRAG | WINDOWCLOSE | SMART_REFRESH | ACTIVATE,
  343.   NULL, NULL, (UBYTE *)"Informationen",
  344.   NULL, NULL, 116, 50, 408, 140, WBENCHSCREEN };
  345.  
  346. /*************************************************************
  347.  * globale Strukturen für Dateinameneingabe (nur OS 1.2/1.3) *
  348.  *************************************************************/
  349.  
  350. char dateistrbuffer[256];
  351. char dateistrundo[256];
  352. SHORT DateiWerte1[] =
  353. { 0, 9, 0, 0, 354, 0 };
  354. SHORT DateiWerte2[] =
  355. { 354, 1, 354, 9, 1, 9 };
  356. SHORT DateiWerte3[] =
  357. { 0, 11, 0, 0, 356, 0 };
  358. SHORT DateiWerte4[] =
  359. { 356, 1, 356, 11, 1, 11 };
  360. struct IntuiText DateiText1 =
  361. { 1, 0, JAM2, 16, 16, &Font, NULL, NULL };
  362. struct Border DateiBorder4 =
  363. { -2, -2, 1, 0, JAM1, 3, DateiWerte4, NULL };
  364. struct Border DateiBorder3 =
  365. { -2, -2, 2, 0, JAM1, 3, DateiWerte3, &DateiBorder4 };
  366. struct Border DateiBorder2 =
  367. { -1, -1, 2, 0, JAM1, 3, DateiWerte2, &DateiBorder3 };
  368. struct Border DateiBorder1 =
  369. { -1, -1, 1, 0, JAM1, 3, DateiWerte1, &DateiBorder2 };
  370. struct StringInfo DateiStringInfo =
  371. { dateistrbuffer, dateistrundo, 0, 256, 0, 0, 0, 0, 0, 0, NULL, 0L, NULL };
  372. struct Gadget DateiGadget1 =
  373. { NULL, 16, 29, 352, 8, GADGHCOMP, RELVERIFY, STRGADGET,
  374.   &DateiBorder1, NULL, &DateiText1, NULL, &DateiStringInfo, 1, NULL };
  375. struct NewWindow DateiNewWindow =
  376. { 128, 106, 384, 43, -1, -1, CLOSEWINDOW | GADGETUP,
  377.   WINDOWDEPTH | WINDOWDRAG | WINDOWCLOSE | SMART_REFRESH | ACTIVATE,
  378.   &DateiGadget1, NULL, (UBYTE *)"Dateinameneingabe",
  379.   NULL, NULL, 116, 50, 408, 140, WBENCHSCREEN };
  380.  
  381. /*********************************************
  382.  * globale Strukturen für Einstellungswindow *
  383.  *********************************************/
  384.  
  385. char einst1strbuffer[10], einst2strbuffer[10], einst3strbuffer[10];
  386. char einststrundo[10], einst4strbuffer[8];
  387. SHORT EinstWerte1[] =
  388. { 0, 9, 0, 0, 170, 0 };
  389. SHORT EinstWerte2[] =
  390. { 170, 1, 170, 9, 1, 9 };
  391. SHORT EinstWerte3[] =
  392. { 0, 11, 0, 0, 172, 0 };
  393. SHORT EinstWerte4[] =
  394. { 172, 1, 172, 11, 1, 11 };
  395. SHORT EinstWerte5[] =
  396. { 0, 9, 0, 0, 98, 0 };
  397. SHORT EinstWerte6[] =
  398. { 98, 1, 98, 9, 1, 9 };
  399. SHORT EinstWerte7[] =
  400. { 0, 11, 0, 0, 100, 0 };
  401. SHORT EinstWerte8[] =
  402. { 100, 1, 100, 11, 1, 11 };
  403. SHORT EinstWerte9[] =
  404. { 0, 11, 0, 0, 48, 0 };
  405. SHORT EinstWerte10[] =
  406. { 48, 1, 48, 11, 1, 11 };
  407. struct StringInfo Einst4StringInfo =
  408. { einst4strbuffer, einststrundo, 0, 7, 0, 0, 0, 0, 0, 0, NULL, 0L, NULL };
  409. struct StringInfo Einst3StringInfo =
  410. { einst3strbuffer, einststrundo, 0, 9, 0, 0, 0, 0, 0, 0, NULL, 0L, NULL };
  411. struct StringInfo Einst2StringInfo =
  412. { einst2strbuffer, einststrundo, 0, 9, 0, 0, 0, 0, 0, 0, NULL, 0L, NULL };
  413. struct StringInfo Einst1StringInfo =
  414. { einst1strbuffer, einststrundo, 0, 9, 0, 0, 0, 0, 0, 0, NULL, 0L, NULL };
  415. struct Border EinstBorder10 =
  416. { 0, 0, 1, 0, JAM1, 3, EinstWerte10, NULL };
  417. struct Border EinstBorder9 =
  418. { 0, 0, 2, 0, JAM1, 3, EinstWerte9, &EinstBorder10 };
  419. struct Border EinstBorder8 =
  420. { -2, -2, 1, 0, JAM1, 3, EinstWerte8, NULL };
  421. struct Border EinstBorder7 =
  422. { -2, -2, 2, 0, JAM1, 3, EinstWerte7, &EinstBorder8 };
  423. struct Border EinstBorder6 =
  424. { -1, -1, 2, 0, JAM1, 3, EinstWerte6, &EinstBorder7 };
  425. struct Border EinstBorder5 =
  426. { -1, -1, 1, 0, JAM1, 3, EinstWerte5, &EinstBorder6 };
  427. struct Border EinstBorder4 =
  428. { -2, -2, 1, 0, JAM1, 3, EinstWerte4, NULL };
  429. struct Border EinstBorder3 =
  430. { -2, -2, 2, 0, JAM1, 3, EinstWerte3, &EinstBorder4 };
  431. struct Border EinstBorder2 =
  432. { -1, -1, 2, 0, JAM1, 3, EinstWerte2, &EinstBorder3 };
  433. struct Border EinstBorder1 =
  434. { -1, -1, 1, 0, JAM1, 3, EinstWerte1, &EinstBorder2 };
  435. struct IntuiText EinstText5 =
  436. { 1, 0, JAM2, 186, 51, &Font, (UBYTE *)"                ", NULL };
  437. struct IntuiText EinstText4 =
  438. { 1, 0, JAM2, 186, 28, &Font, (UBYTE *)"                ", &EinstText5 };
  439. struct IntuiText EinstText1 =
  440. { 1, 0, JAM2, 2, -10, &Font, (UBYTE *)"Einträge Labeltabelle", NULL };
  441. struct IntuiText EinstText2 =
  442. { 1, 0, JAM2, 2, -10, &Font, (UBYTE *)"Einträge Makrotabelle", NULL };
  443. struct IntuiText EinstText3 =
  444. { 1, 0, JAM2, 2, -10, &Font, (UBYTE *)"Größe Makrospeicher", NULL };
  445. struct IntuiText EinstText7 =
  446. { 1, 0, JAM2, 2, -10, &Font, (UBYTE *)"Refresh-Rate", NULL };
  447. struct IntuiText EinstText8 =
  448. { 1, 0, JAM2, 70, 2, &Font, (UBYTE *)"OK !", NULL };
  449. struct IntuiText EinstText9 =
  450. { 1, 0, JAM2, 8, 2, &Font, (UBYTE *)"Sort", NULL };
  451. struct Gadget EinstGadget6 =
  452. { NULL, 238, 90, 49, 12, GADGHCOMP, RELVERIFY | TOGGLESELECT, BOOLGADGET,
  453.   &EinstBorder9, NULL, &EinstText9, NULL, NULL, 6, NULL };
  454. struct Gadget EinstGadget5 =
  455. { &EinstGadget6, 14, 90, 181, 12, GADGHCOMP, RELVERIFY, BOOLGADGET,
  456.   &GadgetBorder1, NULL, &EinstText8, NULL, NULL, 5, NULL };
  457. struct Gadget EinstGadget4 =
  458. { &EinstGadget5, 212, 74, 96, 8, GADGHCOMP, RELVERIFY | STRINGCENTER |
  459.   LONGINT, STRGADGET, &EinstBorder5, NULL, &EinstText7, NULL,
  460.   &Einst4StringInfo, 4, NULL };
  461. struct Gadget EinstGadget3 =
  462. { &EinstGadget4, 14, 74, 168, 8, GADGHCOMP, RELVERIFY | STRINGCENTER |
  463.   LONGINT, STRGADGET, &EinstBorder1, NULL, &EinstText3, NULL,
  464.   &Einst3StringInfo, 3, NULL };
  465. struct Gadget EinstGadget2 =
  466. { &EinstGadget3, 14, 51, 168, 8, GADGHCOMP, RELVERIFY | STRINGCENTER |
  467.   LONGINT, STRGADGET, &EinstBorder1, NULL, &EinstText2, NULL,
  468.   &Einst2StringInfo, 2, NULL };
  469. struct Gadget EinstGadget1 =
  470. { &EinstGadget2, 14, 28, 168, 8, GADGHCOMP, RELVERIFY | STRINGCENTER |
  471.   LONGINT, STRGADGET, &EinstBorder1, NULL, &EinstText1, NULL,
  472.   &Einst1StringInfo, 1, NULL };
  473. struct NewWindow EinstNewWindow =
  474. { 154, 50, 332, 106, -1, -1, CLOSEWINDOW | GADGETUP,
  475.   WINDOWDEPTH | WINDOWDRAG | WINDOWCLOSE | SMART_REFRESH | ACTIVATE,
  476.   &EinstGadget1, NULL, (UBYTE *)"Einstellungen",
  477.   NULL, NULL, 116, 50, 408, 140, WBENCHSCREEN };
  478.  
  479. /**************************************************
  480.  * globale Variablen, Zeiger, Arrays und Tabellen *
  481.  **************************************************/
  482.  
  483. VOID *AllocMem();
  484. void *OpenLibrary();
  485. struct Window *OpenWindow();
  486. unsigned long AvailMem();
  487.  
  488. struct Einstellungen Einst =
  489. { 32768L, 128L*(long)sizeof(struct Macro),
  490.   2000L*(long)sizeof(struct Label),20,TRUE };
  491. extern struct ExecBase *SysBase;
  492. BOOL   OS20;
  493. BOOL DateiReq(char *filename,char *AnzeigeText,char *Show);
  494. extern int Enable_Abort;
  495. struct IntuitionBase *IntuitionBase = 0L;
  496. struct Window *MainWindow = 0L;
  497. struct MacroStack MacroStack[32];
  498. struct MacroStack *MacroPointer;
  499. struct Macro *MacroTable = 0L;
  500. char *MacroMem = 0L;
  501. struct Block BlockTable[32];
  502. char blockcounter = 0;
  503. struct IncludeStack IncludeStack[32];
  504. struct IncludeStack *IncludePointer;
  505. struct Label *LabelTable = 0L;
  506. char workbuffer[256];
  507. char *actposition = 0L;
  508. unsigned char mainbuffer[512];
  509. unsigned char outbuffer[512];
  510. unsigned int pos = 0;
  511. unsigned long bufferlenght = 512L;
  512. unsigned long actlenght = 512L;
  513. unsigned long endbuffer = 0L;
  514. unsigned int macronumber = 0, actmacro = 0;
  515. char *macroup = 0L;
  516. unsigned long labelnumber = 0L;
  517. struct FileHandle *SourceHandle = 0L;
  518. struct FileHandle *ObjectHandle = 0L;
  519. struct FileHandle *PrintHandle = 0L;
  520. /* struct FileHandle *Open(); */
  521. char mnemonic, pseudo, macro;
  522. char test[256], operand[32][80];
  523. unsigned int pc = 0, params[10], start, over, aver;
  524. BOOL defd[10], run;
  525. unsigned char error = 255;
  526. char pass = 0;
  527. unsigned long completelines = 0L, lines = 0L;
  528. char actname[256], objname[256], srcname[256], prtname[256];
  529. BOOL nerror = FALSE;
  530. char *zeiger, label[32], paramcount;
  531. unsigned int linelenght = 0;
  532. BOOL define = TRUE, prtflag = FALSE, printed = FALSE;
  533. unsigned char zeile[256];
  534. unsigned int aufruf;
  535.  
  536. #define MNEMONICS 56
  537. char mnemonics[MNEMONICS][4] =
  538. {
  539.    "LDA", "LDX", "LDY", "STA", "STX", "STY",
  540.    "TAX", "TAY", "TXA", "TYA", "TXS", "TSX",
  541.    "PLA", "PHA", "PLP", "PHP", "ADC", "SBC",
  542.    "INC", "DEC", "INX", "DEX", "INY", "DEY",
  543.    "AND", "ORA", "EOR", "CMP", "CPX", "CPY",
  544.    "BIT", "BCC", "BCS", "BEQ", "BNE", "BMI",
  545.    "BPL", "BVC", "BVS", "JMP", "JSR", "ASL",
  546.    "LSR", "ROL", "ROR", "CLC", "CLD", "CLI",
  547.    "CLV", "SEC", "SED", "SEI", "NOP", "RTS",
  548.    "RTI", "BRK"
  549. };
  550.  
  551. #define PSEUDOS 13
  552. char pseudos[PSEUDOS][11] =
  553. {
  554.    "BYTE", "WORD", "EQUAL", "BASE", "INCLUDE",
  555.    "IF", "ELSE", "ENDIF", "APPEND", "MACRO",
  556.    "ENDMACRO", "BLOCK", "ASCII"
  557. };
  558.  
  559. unsigned char opcodes[MNEMONICS][12] =
  560. {
  561.    { 0xa9,0xad,0xbd,0xb9,0xa5,0xb5,0xff,0xa1,0xb1,0xff,0xff,0xff },
  562.    { 0xa2,0xae,0xff,0xbe,0xa6,0xff,0xb6,0xff,0xff,0xff,0xff,0xff },
  563.    { 0xa0,0xac,0xbc,0xff,0xa4,0xb4,0xff,0xff,0xff,0xff,0xff,0xff },
  564.    { 0xff,0x8d,0x9d,0x99,0x85,0x95,0xff,0x81,0x91,0xff,0xff,0xff },
  565.    { 0xff,0x8e,0xff,0xff,0x86,0xff,0x96,0xff,0xff,0xff,0xff,0xff },
  566.    { 0xff,0x8c,0xff,0xff,0x84,0x94,0xff,0xff,0xff,0xff,0xff,0xff },
  567.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xaa },
  568.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xa8 },
  569.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x8a },
  570.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x98 },
  571.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9a },
  572.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xba },
  573.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x68 },
  574.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x48 },
  575.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x28 },
  576.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x08 },
  577.    { 0x69,0x6d,0x7d,0x79,0x65,0x75,0xff,0x61,0x71,0xff,0xff,0xff },
  578.    { 0xe9,0xed,0xfd,0xf9,0xe5,0xf5,0xff,0xe1,0xf1,0xff,0xff,0xff },
  579.    { 0xff,0xee,0xfe,0xff,0xe6,0xf6,0xff,0xff,0xff,0xff,0xff,0xff },
  580.    { 0xff,0xce,0xde,0xff,0xc6,0xd6,0xff,0xff,0xff,0xff,0xff,0xff },
  581.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe8 },
  582.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xca },
  583.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc8 },
  584.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x88 },
  585.    { 0x29,0x2d,0x3d,0x39,0x25,0x35,0xff,0x21,0x31,0xff,0xff,0xff },
  586.    { 0x09,0x0d,0x1d,0x19,0x05,0x15,0xff,0x01,0x11,0xff,0xff,0xff },
  587.    { 0x49,0x4d,0x5d,0x59,0x45,0x55,0xff,0x41,0x51,0xff,0xff,0xff },
  588.    { 0xc9,0xcd,0xdd,0xd9,0xc5,0xd5,0xff,0xc1,0xd1,0xff,0xff,0xff },
  589.    { 0xe0,0xec,0xff,0xff,0xe4,0xff,0xff,0xff,0xff,0xff,0xff,0xff },
  590.    { 0xc0,0xcc,0xff,0xff,0xc4,0xff,0xff,0xff,0xff,0xff,0xff,0xff },
  591.    { 0xff,0x2c,0xff,0xff,0x24,0xff,0xff,0xff,0xff,0xff,0xff,0xff },
  592.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x90,0xff,0xff },
  593.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xb0,0xff,0xff },
  594.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0xff },
  595.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd0,0xff,0xff },
  596.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x30,0xff,0xff },
  597.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x10,0xff,0xff },
  598.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x50,0xff,0xff },
  599.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x70,0xff,0xff },
  600.    { 0xff,0x4c,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6c,0xff },
  601.    { 0xff,0x20,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff },
  602.    { 0xff,0x0e,0x1e,0xff,0x06,0x16,0xff,0xff,0xff,0xff,0xff,0x0a },
  603.    { 0xff,0x4e,0x5e,0xff,0x46,0x56,0xff,0xff,0xff,0xff,0xff,0x4a },
  604.    { 0xff,0x2e,0x3e,0xff,0x26,0x36,0xff,0xff,0xff,0xff,0xff,0x2a },
  605.    { 0xff,0x6e,0x7e,0xff,0x66,0x76,0xff,0xff,0xff,0xff,0xff,0x6a },
  606.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x18 },
  607.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xd8 },
  608.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x58 },
  609.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xb8 },
  610.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x38 },
  611.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8 },
  612.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x78 },
  613.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xea },
  614.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x60 },
  615.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x40 },
  616.    { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00 },
  617. };
  618.  
  619. char laenge[12] =
  620. {
  621.    2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 3, 1
  622. };
  623.  
  624. #define ERRORS 66
  625. char errors[ERRORS][47] =
  626. {
  627.    "Fehler beim Lesen der Quelldatei !           ",    /* 0 */
  628.    "Fehler beim Öffnen der Quell-/Include-Datei !",    /* 1 */
  629.    "Quellcodezeile zu lang (max. 255 Zeichen) !  ",    /* 2 */
  630.    "Label bereits definiert !                    ",    /* 3 */
  631.    "Zu viele Operanden (max. 32) !               ",    /* 4 */
  632.    "Fehlerhafter Label-/Mnemonic-/Makro-Name !   ",    /* 5 */
  633.    "Labeltabelle voll !                          ",    /* 6 */
  634.    "Operand zu lang (max. 128 Zeichen) !         ",    /* 7 */
  635.    "Zu viele Includefiles (max. 32) !            ",    /* 8 */
  636.    "Includefilename fehlt !                      ",    /* 9 */
  637.    "Makroname fehlt !                            ",    /* 10 */
  638.    "Makrotabelle voll !                          ",    /* 11 */
  639.    "Makrospeicher voll !                         ",    /* 12 */
  640.    ".ENDMACRO fehlt !                            ",    /* 13 */
  641.    "Keine Schachtelung von Makrodefinitionen !   ",    /* 14 */
  642.    "Zu viele Makros (max. 32) !                  ",    /* 15 */
  643.    "Unbekannte Rechenoperation !                 ",    /* 16 */
  644.    "Unerlaubte Ziffer !                          ",    /* 17 */
  645.    "Überlauf (Ergebnis > 65535) !                ",    /* 18 */
  646.    "Kein .INCLUDE innerhalb Makrodefinition !    ",    /* 19 */
  647.    "Mnemonic/Pseudoopcode/Makro erwartet !       ",    /* 20 */
  648.    "Labelname zu lang (max. 32 Zeichen) !        ",    /* 21 */
  649.    "Zuzuweisender Wert fehlt !                   ",    /* 22 */
  650.    "Labelname fehlt !                            ",    /* 23 */
  651.    "Unbekanntes Label !                          ",    /* 24 */
  652.    "Makroparameter fehlt !                       ",    /* 25 */
  653.    "Unbekannter Makroparameter !                 ",    /* 26 */
  654.    "Makroparameternummer erwartet !              ",    /* 27 */
  655.    "Term unvollständig !                         ",    /* 28 */
  656.    "Unbekannte Adressierungsart !                ",    /* 29 */
  657.    "Operand zu lang, Byte erwartet !             ",    /* 30 */
  658.    "Unerlaubte Adressierungsart !                ",    /* 31 */
  659.    "Startadresse fehlt !                         ",    /* 32 */
  660.    "Branchsprung außerhalb Reichweite !          ",    /* 33 */
  661.    "Fehler beim Öffnen der Objektdatei !         ",    /* 34 */
  662.    "Fehler beim Schreiben in Objektdatei !       ",    /* 35 */
  663.    "Zu wenig Speicher frei !                     ",    /* 36 */
  664.    "Assemblierung abgebrochen !                  ",    /* 37 */
  665.    ".ENDMACRO ohne .MACRO !                      ",    /* 38 */
  666.    "Filename der Objektdatei fehlt !             ",    /* 39 */
  667.    ".BASE-Befehl mit Objektdateiname fehlt !     ",    /* 40 */
  668.    "Vergleichsoperand fehlt !                    ",    /* 41 */
  669.    "Zu viele Makroparameter (max. 10) !          ",    /* 42 */
  670.    "Kann Window nicht öffnen !                   ",    /* 43 */
  671.    "Fehler beim Abspeichern der Einstellungen !  ",    /* 44 */
  672.    "Fehler beim Laden der Einstellungen !        ",    /* 45 */
  673.    "Fehler beim Öffnen des Parallelports !       ",    /* 46 */
  674.    "Fehler beim Lesen der Objektdatei !          ",    /* 47 */
  675.    "Fehler beim Senden über Parallelport !       ",    /* 48 */
  676.    "Übertragung läuft...                         ",    /* 49 */
  677.    "ASCII-Zeichen erwartet !                     ",    /* 50 */
  678.    "Fehler in Konvertierungstabellendatei !      ",    /* 51 */
  679.    "Lade Konvertierungstabelle...                ",    /* 52 */
  680.    "Lade Einstellungsdatei...                    ",    /* 53 */
  681.    "Speichere Einstellungsdatei...               ",    /* 54 */
  682.    "Unerlaubte Labelposition !                   ",    /* 55 */
  683.    "Sortiere Labeltabelle...                     ",    /* 56 */
  684.    "Quelldateiausdruck angeschaltet...           ",    /* 57 */
  685.    "Quelldateiausdruck ausgeschaltet...          ",    /* 58 */
  686.    "Fehler beim Öffnen der Druckdatei !          ",    /* 59 */
  687.    "Fehler beim Ausdruck !                       ",    /* 60 */
  688.    "Druck läuft...                               ",    /* 61 */
  689.    "Vergleichoperator fehlt !                    ",    /* 62 */
  690.    "Unbekannter/Unerlaubter Vergleichsoperator ! ",    /* 63 */
  691.    "Division durch 0 !                           ",    /* 64 */
  692.    "Makro bereits definiert !                    "     /* 65 */
  693. };
  694.  
  695. unsigned char addr[5][5] =
  696. {
  697.    { '(',',','x',')', 7 },
  698.    { '(',')',',','y', 8 },
  699.    { 255,255,',','x', 5 },
  700.    { 255,255,',','y', 6 },
  701.    { '(',255,255,')', 10 }
  702. };
  703.  
  704. /********************
  705.  * Programm beenden *
  706.  ********************/
  707.  
  708. void freeit()
  709. {
  710.    if(LabelTable)
  711.       FreeMem(LabelTable, Einst.labellenght);
  712.    if(MacroMem)
  713.       FreeMem(MacroMem, Einst.macromemlenght);
  714.    if(MacroTable)
  715.       FreeMem(MacroTable, Einst.macrotablelenght);
  716.    if(SourceHandle)
  717.       Close(SourceHandle);
  718.    LabelTable = MacroMem = MacroTable = SourceHandle = 0L;
  719. }
  720.  
  721. /***********************************
  722.  * Alles öffnen und initialisieren *
  723.  ***********************************/
  724.  
  725. BOOL init()
  726. {
  727.    workbuffer[0] = '\0';
  728.  
  729.    if(!(MacroTable = (struct Macro *)
  730.       AllocMem(Einst.macrotablelenght, MEMF_CLEAR)))
  731.    {
  732.       error = 36;
  733.       return(FALSE);
  734.    }
  735.    if(!(MacroMem = (char *)
  736.       AllocMem(Einst.macromemlenght, MEMF_CLEAR)))
  737.    {
  738.       error = 36;
  739.       return(FALSE);
  740.    }
  741.    if(!(LabelTable = (struct Label *)
  742.       AllocMem(Einst.labellenght, MEMF_CLEAR)))
  743.    {
  744.       error = 36;
  745.       return(FALSE);
  746.    }
  747.    return(TRUE);
  748. }
  749.  
  750. /*************************
  751.  * Hauptwindow schließen *
  752.  *************************/
  753.  
  754. void closeall()
  755. {
  756.    if(MainWindow)
  757.    {
  758.       ClearMenuStrip(MainWindow);
  759.       CloseWindow(MainWindow);
  760.    }
  761.    if(IntuitionBase)
  762.       CloseLibrary(IntuitionBase);
  763.    exit(FALSE);
  764. }
  765.  
  766. /**********************
  767.  * Hauptwindow öffnen *
  768.  **********************/
  769. extern BOOL saveeinst();
  770. extern BOOL loadeinst();
  771.  
  772. void openall()
  773. {
  774.    register int i;
  775.  
  776.    OS20 = (SysBase->LibNode.lib_Version >= 37);
  777.  
  778.    if(!(IntuitionBase = (struct IntuitionBase *)
  779.       OpenLibrary("intuition.library", 0L)))
  780.       closeall();
  781.    Gadget1.GadgetText = &GadgetText1;
  782.    for(i=0; i<256; i++)
  783.       Einst.converttable[i] = i;
  784.    if(!(MainWindow = (struct Window *)
  785.       OpenWindow(&MainNewWindow)))
  786.       closeall();
  787.    if(!loadeinst())
  788.    {
  789.       error = 255;
  790.       saveeinst();
  791.    }
  792.    SetMenuStrip(MainWindow, &MenuDatei);
  793.    DrawBorder(MainWindow->RPort, &Border1, 0L, 0L);
  794.    prtname[0] = '\0';
  795. }
  796.  
  797. /*****************************
  798.  * Datei zum Anhängen öffnen *
  799.  *****************************/
  800.  
  801. struct FileHandle *append(name)
  802. char *name;
  803. {
  804.    struct FileHandle *handle = 0L;
  805.  
  806.    if(handle = Open(name, MODE_OLDFILE))
  807.    {
  808.       if(Seek(handle, 0L, 1L) == 1L)
  809.       {
  810.          Close(handle);
  811.          return((struct FileHandle *)0L);
  812.       }
  813.    }
  814.    else
  815.    {
  816.       if(!(handle = Open(name, MODE_NEWFILE)))
  817.          return((struct FileHandle *)0L);
  818.    }
  819.    return(handle);
  820. }
  821.  
  822. /***********************
  823.  * Status neu anzeigen *
  824.  ***********************/
  825.  
  826. void refreshstatus()
  827. {
  828.    if((actmacro == macronumber) || !macronumber)
  829.    {
  830.       if(actname[0])
  831.          sprintf(Text2.IText, "Quelldatei:  %-32.32s", actname);
  832.       else
  833.          sprintf(Text2.IText, "Quelldatei:  --------------------------------");
  834.    }
  835.    else
  836.       sprintf(Text2.IText, "akt. Makro:  %-32.32s", MacroTable[actmacro].name);
  837.    if(objname[0])
  838.       sprintf(Text3.IText, "Objektdatei: %-32.32s", objname);
  839.    else
  840.       sprintf(Text3.IText, "Objektdatei: --------------------------------");
  841.    sprintf(Text4.IText, "Code: $%04x - $%04x     Länge: %05u Byte", 
  842.             start, pc, pc-start);
  843.    sprintf(Text5.IText, "Anzahl Symbole: %05lu   Anzahl Makros: %05u",
  844.             labelnumber, macronumber);
  845.    sprintf(Text6.IText, "Zeile: %06lu  Zeilen insg: %06lu   Pass: -",
  846.             lines, completelines);
  847.    if(error == 255)
  848.    {
  849.       if(run)
  850.          sprintf(Text7.IText, "Assemblierung läuft...                       ");
  851.       else
  852.          sprintf(Text7.IText, "Kein Fehler aufgetreten.                     ");
  853.    }
  854.    else
  855.       sprintf(Text7.IText, "%s", errors[error]);
  856.    if(pass)
  857.       Text6.IText[43] = pass+'0';
  858.    else
  859.       Text6.IText[43] = '-';
  860.    PrintIText(MainWindow->RPort, &Text1, 0L, 0L);
  861. }
  862.  
  863. /***************************************************
  864.  * Ausgabe einer unbearbeiteten Zeile für Ausdruck *
  865.  ***************************************************/
  866.  
  867. BOOL printline()
  868. {
  869.    char pstring[320];
  870.  
  871.    if(prtflag && (pass == 2))
  872.    {
  873.       printed = TRUE;
  874.       sprintf(pstring, "%7lu : %04x          %s\n", completelines, pc, workbuffer);
  875.       if((Write(PrintHandle, pstring, (long)strlen(pstring))) !=
  876.       (long)strlen(pstring))
  877.       {
  878.          error = 60;
  879.          return(FALSE);
  880.       }
  881.    }
  882.    return(TRUE);
  883. }
  884.  
  885. /*********************************
  886.  * Filenamenausgabe für Ausdruck *
  887.  *********************************/
  888.  
  889. BOOL printnames()
  890. {
  891.    char text[640];
  892.  
  893.    if(prtflag && (pass == 2))
  894.    {
  895.       sprintf(text, "\nQuelldatei: %s\nObjektdatei: %s\n\n", actname, objname);
  896.       if((Write(PrintHandle, text, (long)strlen(text))) !=
  897.          (long)strlen(text))
  898.       {
  899.          error = 60;
  900.          return(FALSE);
  901.       }
  902.    }
  903.    return(TRUE);
  904. }
  905.  
  906. /******************
  907.  * Zahl ermitteln *
  908.  ******************/
  909.  
  910. unsigned int getstatement();
  911. unsigned long searchlabel();
  912.  
  913. unsigned long getnumber()
  914. {
  915.    char low = 0;
  916.    register char pot = 10;
  917.    register unsigned long result = 0L;
  918.    char label[32], i;
  919.  
  920.    nerror = FALSE;
  921.  
  922.    if(!*zeiger)
  923.    {
  924.       nerror = TRUE;
  925.       error = 28;
  926.       return(0);
  927.    }
  928.    if(*zeiger == '<') /* Vorzeichen */
  929.    {      
  930.       zeiger++;
  931.       low = 1;
  932.    }
  933.    if(*zeiger == '>')
  934.    {
  935.       zeiger++;
  936.       low = 2;
  937.    }
  938.  
  939.    if((*zeiger == '(') || (*zeiger == '[')) /* Terme */
  940.    {
  941.       zeiger++;
  942.       result = (unsigned long)getstatement();
  943.       if(nerror)
  944.          return(0);
  945.       goto einsprung; /* Unsauber aber wirkungsvoll */
  946.    }
  947.  
  948.    if(*zeiger == '*') /* Programmcounter */
  949.    {
  950.       zeiger++;
  951.       result = (unsigned long)pc;
  952.       goto einsprung; /* siehe oben */
  953.    }
  954.  
  955.    if(*zeiger == '?') /* Makroparameter */
  956.    {
  957.       zeiger++;
  958.       if((!*zeiger) || (!isdigit(*zeiger)))
  959.       {
  960.          nerror = TRUE;
  961.          error = 27;
  962.          return(0);
  963.       }
  964.       i = *zeiger - '0';
  965.       zeiger++;
  966.       if(i >= paramcount)
  967.       {
  968.          nerror = TRUE;
  969.          error = 26;
  970.          return(0);
  971.       }
  972.       if(!defd[i])
  973.       {
  974.          error = 24;
  975.          nerror = TRUE;
  976.          return(0);
  977.       }
  978.       result = (unsigned long)params[i];
  979.       goto einsprung; /* siehe oben */
  980.    }
  981.  
  982.    if(*zeiger == '\'') /* ASCII-Wert (konvertiert) */
  983.    {
  984.       zeiger++;
  985.       if(!*zeiger)
  986.       {
  987.          nerror = TRUE;
  988.          error = 50;
  989.          return(0);
  990.       }
  991.       result = (long)(Einst.converttable[*zeiger]);
  992.       zeiger++;
  993.       goto einsprung;
  994.    }
  995.  
  996.    if(isalpha(*zeiger)) /* Labelwerte */
  997.    {
  998.       i = 0;
  999.       do
  1000.       {
  1001.          label[i] = *zeiger;
  1002.          i++;
  1003.          zeiger++;
  1004.       } while((i<32) && (isdigit(*zeiger) || isalpha(*zeiger) ||
  1005.                          (*zeiger == '_')));
  1006.       if(i==32)
  1007.       {
  1008.          error = 21;
  1009.          nerror = TRUE;
  1010.          return(0);
  1011.       }
  1012.       label[i] = 0;
  1013.       if((result = searchlabel(label)) == labelnumber)
  1014.       {
  1015.          error = 24;
  1016.          nerror = TRUE;
  1017.          return(0);
  1018.       }
  1019.       result = (unsigned long)LabelTable[result].wert;
  1020.       goto einsprung; /* siehe oben */
  1021.    }
  1022.  
  1023.    switch(*zeiger) /* Hex-, Dez-, Binär und Oktalzahlen */
  1024.    {
  1025.       case '$':
  1026.          pot = 16;
  1027.          zeiger++;
  1028.          break;
  1029.       case '%':
  1030.          pot = 2;
  1031.          zeiger++;
  1032.          break;
  1033.       case '&':
  1034.          pot = 8;
  1035.          zeiger++;
  1036.          break;
  1037.    }
  1038.  
  1039.    do
  1040.    {
  1041.       if(isalpha(*zeiger))
  1042.       {
  1043.          if((pot != 16) || (toupper(*zeiger) > 'F'))
  1044.          {
  1045.             error = 17;
  1046.             nerror = TRUE;
  1047.             return(0);
  1048.          }
  1049.          result = result * 16L + (long)(toupper(*zeiger) - 'A' + 10);
  1050.       }
  1051.       if(isdigit(*zeiger))
  1052.       {
  1053.          if((*zeiger-'0') >= pot)
  1054.          {
  1055.             error = 17;
  1056.             nerror = TRUE;
  1057.             return(0);
  1058.          }
  1059.          result = result * (long)pot + (long)(toupper(*zeiger) - '0');
  1060.       }
  1061.       zeiger++;
  1062.    } while(isdigit(*zeiger) || isalpha(*zeiger));
  1063.  
  1064.    einsprung:
  1065.    if(result > 65535)
  1066.    {
  1067.       error = 18;
  1068.       nerror = TRUE;
  1069.       return(0);
  1070.    }
  1071.    if(low == 1)
  1072.       return(result - 256L * (result / 256L));
  1073.    if(low == 2)
  1074.       return(result / 256L);
  1075.    return(result);
  1076. }
  1077.  
  1078. /******************
  1079.  * Term berechnen *
  1080.  ******************/
  1081.  
  1082. unsigned int getstatement()
  1083. {
  1084.    register unsigned long result = 0L, zresult;
  1085.    char rechenz = '+', nrechenz = '*';
  1086.    unsigned long w;
  1087.  
  1088.    while(*zeiger && (rechenz != ')') && (rechenz != ']'))
  1089.    {
  1090.       zresult = 1L;
  1091.       nrechenz = '*';
  1092.       do
  1093.       {
  1094.          switch(nrechenz)
  1095.          {
  1096.             case '*':
  1097.                zresult *= getnumber();
  1098.                break;
  1099.             case '/':
  1100.                if(!(w = getnumber()))
  1101.                {
  1102.                   nerror = TRUE;
  1103.                   error = 64;
  1104.                   return(0);
  1105.                }
  1106.                zresult /= w;
  1107.                break;
  1108.          }
  1109.          if(nerror)
  1110.             return(0);
  1111.          nrechenz = *zeiger;
  1112.          if(*zeiger)
  1113.             zeiger++;
  1114.       } while((nrechenz == '*') || (nrechenz == '/'));
  1115.       if(nrechenz)
  1116.          zeiger--;
  1117.  
  1118.       switch(rechenz)
  1119.       {
  1120.          case '+':
  1121.             result += zresult;
  1122.             break;
  1123.          case '-':
  1124.             result -= zresult;
  1125.             break;
  1126.          case '|':
  1127.             result |= zresult;
  1128.             break;
  1129.          case '&':
  1130.             result &= zresult;
  1131.             break;
  1132.          case '<':
  1133.             result <<= zresult;
  1134.             break;
  1135.          case '>':
  1136.             result >>= zresult;
  1137.             break;
  1138.          default:
  1139.             error = 16;
  1140.             nerror = TRUE;
  1141.             return(0);
  1142.       }
  1143.       rechenz = *zeiger;
  1144.       if(rechenz)
  1145.          zeiger++;
  1146.    }
  1147.    if(result > 65535L)
  1148.    {
  1149.       error = 18;
  1150.       nerror = TRUE;
  1151.       return(0);
  1152.    }
  1153.    nerror = FALSE;
  1154.    return((unsigned int)result);
  1155. }
  1156.  
  1157. /***********************
  1158.  * Buffer neu einlesen *
  1159.  ***********************/
  1160.  
  1161. BOOL readbuffer()
  1162. {
  1163.    actlenght = Read(SourceHandle, mainbuffer, bufferlenght);
  1164.    if(IoErr() >= 100)
  1165.       return(FALSE);
  1166.    endbuffer = mainbuffer+actlenght;
  1167.    actposition = mainbuffer;
  1168.    return(TRUE);
  1169. }
  1170.  
  1171. /**************************
  1172.  * Zeile aus Buffer holen *
  1173.  **************************/
  1174.  
  1175. BOOL getline()
  1176. {
  1177.    register char counter = 0;
  1178.    char i;
  1179.  
  1180.    while(((*actposition != 0x0a) && (counter < 255)) ||
  1181.          (actposition == (char *)endbuffer))
  1182.    {
  1183.       if(actposition == (char *)endbuffer)
  1184.       {
  1185.          if(actlenght == bufferlenght)
  1186.          {
  1187.             if(!readbuffer())
  1188.                return(FALSE);
  1189.             continue;
  1190.          }
  1191.          else
  1192.          {
  1193.             if(MacroPointer == MacroStack)
  1194.             {
  1195.                actmacro = macronumber;
  1196.                if(SourceHandle)
  1197.                   Close(SourceHandle);
  1198.                SourceHandle = 0L;
  1199.                if(IncludePointer == IncludeStack)
  1200.                   return(FALSE);
  1201.                IncludePointer--;
  1202.                strcpy(actname, IncludePointer->lastfile);
  1203.                if(!(SourceHandle = (struct FileHandle *)
  1204.                   Open(actname, (ULONG)MODE_OLDFILE)))
  1205.                {
  1206.                   error = 1;
  1207.                   return(FALSE);
  1208.                }
  1209.                lines = 0L;
  1210.                if(!readbuffer())
  1211.                   return(FALSE);
  1212.                while(lines < (IncludePointer->lineafter))
  1213.                {
  1214.                   if(!getline())
  1215.                      return(FALSE);
  1216.                   completelines--;
  1217.                }
  1218.                if(!printnames())
  1219.                   return(FALSE);
  1220.                continue;
  1221.             }
  1222.             else
  1223.             {
  1224.                MacroPointer--;
  1225.                actposition = MacroPointer->pointer;
  1226.                endbuffer = MacroPointer->endbuffer;
  1227.                actlenght = MacroPointer->actlenght;
  1228.                actmacro = MacroPointer->number;
  1229.                lines = MacroPointer->lineafter;
  1230.                paramcount = MacroPointer->paramcount;
  1231.                aufruf = MacroPointer->aufruf;
  1232.                for(i=0; i<paramcount; i++)
  1233.                {
  1234.                   params[i] = MacroPointer->params[i];
  1235.                   defd[i] = MacroPointer->defd[i];
  1236.                }
  1237.                continue;
  1238.             }
  1239.          }
  1240.       }
  1241.       workbuffer[counter] = *actposition;
  1242.       counter++;
  1243.       actposition++;
  1244.    }
  1245.    if(counter == 255)
  1246.    {
  1247.       error = 2;
  1248.       return(FALSE);
  1249.    }
  1250.    workbuffer[counter] = 0;
  1251.    completelines++;
  1252.    lines++;
  1253.    actposition++;
  1254.    return(TRUE);
  1255. }
  1256.  
  1257. /****************
  1258.  * Label suchen *
  1259.  ****************/
  1260.  
  1261. unsigned long searchlabel(name)
  1262. char *name;
  1263. {
  1264.    register unsigned long number = 0L;
  1265.  
  1266.    while(number < labelnumber)
  1267.    {
  1268.       if(!strcmp(LabelTable[number].name, name))
  1269.       {
  1270.          if(LabelTable[number].aufruf == 0)
  1271.             return(number);
  1272.          if((LabelTable[number].macro == actmacro) &&
  1273.             (LabelTable[number].aufruf == aufruf))
  1274.             return(number);
  1275.       }
  1276.       number++;
  1277.    }
  1278.    return(labelnumber);
  1279. }
  1280.  
  1281. /*******************
  1282.  * Mnemonic suchen *
  1283.  *******************/
  1284.  
  1285. char searchmnemonic(source)
  1286. char *source;
  1287. {
  1288.    register char number = 0, i = 0;
  1289.  
  1290.    while(number < MNEMONICS)
  1291.    {
  1292.       for(i=0;(i<4) && (toupper(source[i]) == mnemonics[number][i]);i++)
  1293.          ;
  1294.       if(i==4)
  1295.          return(number);
  1296.       number++;
  1297.    }
  1298.    return(MNEMONICS);
  1299. }
  1300.  
  1301. /***********************
  1302.  * Pseudoopcode suchen *
  1303.  ***********************/
  1304.  
  1305. char searchpseudo(source)
  1306. char *source;
  1307. {
  1308.    register char number = 0, i = 0;
  1309.  
  1310.    if(source[0] != '.')
  1311.       return(PSEUDOS);
  1312.    while(number < PSEUDOS)
  1313.    {
  1314.       i=1;
  1315.       while((source[i]) && (toupper(source[i]) == pseudos[number][i-1]) &&
  1316.             (i<11))
  1317.          i++;
  1318.       if(i==11)
  1319.          break;
  1320.       if(!source[i])
  1321.          return(number);
  1322.       number++;
  1323.    }
  1324.    return(PSEUDOS);
  1325. }
  1326.  
  1327. /****************
  1328.  * Makro suchen *
  1329.  ****************/
  1330.  
  1331. unsigned int searchmacro(source)
  1332. char *source;
  1333. {
  1334.    register char i = 0;
  1335.    register unsigned int number = 0;
  1336.  
  1337.    while(number < macronumber)
  1338.    {
  1339.       i=0;
  1340.       while((source[i]) && (MacroTable[number].name[i]) &&
  1341.             (source[i] == MacroTable[number].name[i]))
  1342.          i++;
  1343.       if((!source[i]) && (!MacroTable[number].name[i]))
  1344.          return(number);
  1345.       number++;
  1346.    }
  1347.    return(macronumber);
  1348. }
  1349.  
  1350. /**************************
  1351.  * Neues Label definieren *
  1352.  **************************/
  1353.  
  1354. BOOL definelabel(name, number)
  1355. char *name;
  1356. unsigned int number;
  1357. {
  1358.    if(searchlabel(name) != labelnumber)
  1359.    {
  1360.       error = 3;
  1361.       return(FALSE);
  1362.    }
  1363.    if(((labelnumber+1L) * sizeof(struct Label)) >= Einst.labellenght)
  1364.    {
  1365.       error = 6;
  1366.       return(FALSE);
  1367.    }
  1368.    strcpy(LabelTable[labelnumber].name, name);
  1369.    LabelTable[labelnumber].wert = number;
  1370.    if(actmacro != macronumber)
  1371.    {
  1372.       LabelTable[labelnumber].aufruf = aufruf;
  1373.       LabelTable[labelnumber].macro = actmacro;
  1374.    }
  1375.    else
  1376.    {
  1377.       LabelTable[labelnumber].aufruf = 0;
  1378.       LabelTable[labelnumber].macro = 65535;
  1379.    }
  1380.    labelnumber++;
  1381.    return(TRUE);
  1382. }
  1383.  
  1384. /**********************************
  1385.  * Zeile in Bestandteile auflösen *
  1386.  **********************************/
  1387.  
  1388. BOOL divideline()
  1389. {
  1390.    register int i, u;
  1391.    register char *pointer = workbuffer;
  1392.    BOOL flag = TRUE;
  1393.    BOOL quote = FALSE;
  1394.  
  1395.    mnemonic = pseudo = macro = 0;
  1396.    test[0] = label[0] = '\0';
  1397.    for(i=0; i<32; i++)
  1398.       operand[i][0] = '\0';
  1399.  
  1400.    while(flag)
  1401.    {
  1402.       flag = FALSE;
  1403.       i=0;
  1404.       while((*pointer == ' ') || (*pointer == 0x09))
  1405.          pointer++;
  1406.       if(isdigit(*pointer))
  1407.       {
  1408.          error = 5;
  1409.          return(FALSE);
  1410.       }
  1411.       while((*pointer) && (*pointer != ';') && (*pointer != ' ') &&
  1412.             (*pointer != 0x09))
  1413.       {
  1414.          test[i] = *pointer;
  1415.          i++;
  1416.          pointer++;
  1417.       }
  1418.       test[i] = '\0';
  1419.       macro = macronumber;
  1420.       mnemonic = MNEMONICS;
  1421.       pseudo = PSEUDOS;
  1422.       if(!test[0] && !label[0])
  1423.          return(TRUE);
  1424.       if(!test[0] && label[0])
  1425.       {
  1426.          error = 20;
  1427.          return(FALSE);
  1428.       }
  1429.       if(((macro = searchmacro(test))==macronumber) &&
  1430.          ((mnemonic = searchmnemonic(test))==MNEMONICS) &&
  1431.          ((pseudo = searchpseudo(test))==PSEUDOS))
  1432.       {
  1433.          flag = TRUE;
  1434.          if(label[0])
  1435.          {
  1436.             error = 20;
  1437.             return(FALSE);
  1438.          }
  1439.          strcpy(label, test);
  1440.          if(strlen(label) >= 32)
  1441.          {
  1442.             error = 21;
  1443.             return(FALSE);
  1444.          }
  1445.       }
  1446.    }
  1447.    if(label[0] && (((pseudo >= 3) && (pseudo <= 8)) || (pseudo == 9) ||
  1448.                     (pseudo == 10)))
  1449.    {
  1450.       error = 55;
  1451.       return(FALSE);
  1452.    }
  1453.    if((pass == 1) && (pseudo != 2) && (label[0]) && define)
  1454.       if(!definelabel(label, pc))
  1455.          return(FALSE);
  1456.  
  1457.    i = u = 0;
  1458.    if(*pointer)
  1459.    {
  1460.       pointer++;
  1461.       while((*pointer) && (*pointer != ';'))
  1462.       {
  1463.          if(*pointer == '\"')
  1464.          {
  1465.             quote = (quote) ? FALSE : TRUE;
  1466.             pointer++;
  1467.             continue;
  1468.          }
  1469.          if((*pointer == ',') && (mnemonic == MNEMONICS) && (!quote))
  1470.          {
  1471.             operand[u][i] = '\0';
  1472.             pointer++;
  1473.             u++;
  1474.             i=0;
  1475.             if(u>31)
  1476.             {
  1477.                error = 4;
  1478.                return(FALSE);
  1479.             }
  1480.             continue;
  1481.          }
  1482.          if(((*pointer != ' ') && (*pointer != 0x09)) || (quote))
  1483.          {
  1484.             operand[u][i] = *pointer;
  1485.             i++;
  1486.             if(i == 80)
  1487.             {
  1488.                error = 7;
  1489.                return(FALSE);
  1490.             }
  1491.          }
  1492.          pointer++;
  1493.       }
  1494.       operand[u][i] = '\0';
  1495.    }
  1496.    return(TRUE);
  1497. }
  1498.  
  1499. /****************************************
  1500.  * Aktuellen Block in Tabelle eintragen *
  1501.  ****************************************/
  1502.  
  1503. void remarkblock()
  1504. {
  1505.    register int i;
  1506.  
  1507.    if((blockcounter < 32) && (objname[0]) && (pass == 1))
  1508.    {
  1509.       BlockTable[blockcounter].begin = start;
  1510.       BlockTable[blockcounter].end = pc;
  1511.       for(i=0;(i<31) && objname[i];i++)
  1512.          BlockTable[blockcounter].name[i] = objname[i];
  1513.       BlockTable[blockcounter].name[i] = '\0';
  1514.       blockcounter++;
  1515.    }
  1516. }
  1517.  
  1518. /*****************************
  1519.  * Pseudo-Opcodes bearbeiten *
  1520.  *****************************/
  1521.  
  1522. BOOL outbytes();
  1523.  
  1524. BOOL dopseudos()
  1525. {
  1526.    register unsigned char i;
  1527.    register unsigned int wert, anzahl;
  1528.  
  1529.    switch(pseudo)
  1530.    {
  1531.       case  0: /* .BYTE */
  1532.       {
  1533.          i = 0;
  1534.          while((operand[i][0]) && (i<32))
  1535.          {
  1536.             zeiger = operand[i];
  1537.             if(pass == 1)
  1538.                wert = 0;
  1539.             else
  1540.                wert = getstatement();
  1541.             if(nerror)
  1542.             {
  1543.                error = 255;
  1544.                wert = 0;
  1545.             }
  1546.             if(wert > 255)
  1547.             {
  1548.                error = 30;
  1549.                return(FALSE);
  1550.             }
  1551.             zeile[i] = (unsigned char)wert;
  1552.             i++;
  1553.          }
  1554.          linelenght = i;
  1555.          return(TRUE);
  1556.       }
  1557.       case  1: /* .WORD */
  1558.       {
  1559.          i = linelenght = 0;
  1560.          while((operand[i][0]) && (i<32))
  1561.          {
  1562.             zeiger = operand[i];
  1563.             if(pass == 1)
  1564.                wert = 1;
  1565.             else
  1566.                wert = getstatement();
  1567.             if(nerror)
  1568.             {
  1569.                error = 255;
  1570.                wert = 0;
  1571.             }
  1572.             zeile[linelenght] = (unsigned char)(wert - 256 * (wert / 256));
  1573.             zeile[linelenght+1] = (unsigned char)(wert / 256);
  1574.             linelenght += 2;
  1575.             i++;
  1576.          }
  1577.          return(TRUE);
  1578.       }
  1579.       case  2: /* .EQUAL */
  1580.       {
  1581.          if(pass == 2)
  1582.             return(TRUE);
  1583.          if(!operand[0][0])
  1584.          {
  1585.             error = 22;
  1586.             return(FALSE);
  1587.          }
  1588.          if(!label[0])
  1589.          {
  1590.             error = 23;
  1591.             return(FALSE);
  1592.          }
  1593.          zeiger = operand[0];
  1594.          wert = getstatement();
  1595.          if(nerror)
  1596.             return(FALSE);
  1597.          if(!definelabel(label, wert))
  1598.             return(FALSE);
  1599.          return(TRUE);
  1600.       }
  1601.       case  3: /* .BASE */
  1602.       {
  1603.          if(!operand[0][0])
  1604.          {
  1605.             error = 32;
  1606.             return(FALSE);
  1607.          }
  1608.          if(!operand[1][0])
  1609.          {
  1610.             error = 39;
  1611.             return(FALSE);
  1612.          }
  1613.          remarkblock();
  1614.          strcpy(objname, operand[1]);
  1615.          zeiger = operand[0];
  1616.          start = getstatement();
  1617.          if(nerror)
  1618.             return(FALSE);
  1619.          if(!printline())
  1620.             return(FALSE);
  1621.          if(!printnames())
  1622.             return(FALSE);
  1623.          pc = start;
  1624.          if(pass == 2)
  1625.          {
  1626.             if(ObjectHandle)
  1627.             {
  1628.                if(Write(ObjectHandle, outbuffer, (long)pos) != (long)pos)
  1629.                {
  1630.                   error = 36;
  1631.                   return(FALSE);
  1632.                }
  1633.                Close(ObjectHandle);
  1634.             }
  1635.             if(!(ObjectHandle = (struct FileHandle *)
  1636.                Open(objname, (ULONG)MODE_NEWFILE)))
  1637.             {
  1638.                error = 34;
  1639.                return(FALSE);
  1640.             }
  1641.             outbuffer[0] = (unsigned char)(start - 256 * (start / 256));
  1642.             outbuffer[1] = (unsigned char)(start / 256);
  1643.             pos = 2;
  1644.          }
  1645.          return(TRUE);
  1646.       }
  1647.       case  4: /* .INCLUDE */
  1648.       {
  1649.          if(!operand[0][0])
  1650.          {
  1651.             error = 9;
  1652.             return(FALSE);
  1653.          }
  1654.          if(IncludePointer == &IncludeStack[32])
  1655.          {
  1656.             error = 8;
  1657.             return(FALSE);
  1658.          }
  1659.          Close(SourceHandle);
  1660.          SourceHandle = 0L;
  1661.          strcpy(IncludePointer->lastfile, actname);
  1662.          IncludePointer->lineafter = lines;
  1663.          IncludePointer++;
  1664.          strcpy(actname, operand[0]);
  1665.          if(!(SourceHandle = (struct FileHandle *)
  1666.             Open(actname, (ULONG)MODE_OLDFILE)))
  1667.          {
  1668.             error = 1;
  1669.             return(FALSE);
  1670.          }
  1671.          lines = 0L;
  1672.          if(!readbuffer())
  1673.             return(FALSE);
  1674.          if(!printline())
  1675.             return(FALSE);
  1676.          if(!printnames())
  1677.             return(FALSE);
  1678.          return(TRUE);
  1679.       }
  1680.       case 5: /* .IF */
  1681.       case 6: /* .ELSE */
  1682.       {
  1683.          i = 0;
  1684.          if(pseudo == 5)
  1685.          {
  1686.             if(!operand[0][0])
  1687.             {
  1688.                error = 62;
  1689.                return(FALSE);
  1690.             }
  1691.             if(!operand[1][0])
  1692.             {
  1693.                error = 41;
  1694.                return(FALSE);
  1695.             }
  1696.             zeiger = operand[1];
  1697.             wert = getstatement();
  1698.             if(!operand[2][0])
  1699.             {
  1700.                switch(operand[0][0])
  1701.                {
  1702.                   case '=':
  1703.                      if(!nerror)
  1704.                         return(TRUE);
  1705.                      else
  1706.                      {
  1707.                         nerror = FALSE;
  1708.                         error = 255;
  1709.                      }
  1710.                      break;
  1711.                   case '!':
  1712.                      if(nerror)
  1713.                      {
  1714.                         nerror = FALSE;
  1715.                         error = 255;
  1716.                         return(TRUE);
  1717.                      }
  1718.                      break;
  1719.                   default:
  1720.                      error = 63;
  1721.                      return(FALSE);
  1722.                }
  1723.             }
  1724.             else
  1725.             {
  1726.                if(nerror)
  1727.                   return(FALSE);
  1728.                zeiger = operand[2];
  1729.                anzahl = getstatement();
  1730.                if(nerror)
  1731.                   return(FALSE);
  1732.                switch(operand[0][0])
  1733.                {
  1734.                   case  '=':
  1735.                      if(wert == anzahl)
  1736.                         return(TRUE);
  1737.                      break;
  1738.                   case  '!':
  1739.                      if(wert != anzahl)
  1740.                         return(TRUE);
  1741.                      break;
  1742.                   case  '<':
  1743.                      if(wert < anzahl)
  1744.                         return(TRUE);
  1745.                      break;
  1746.                   case  '>':
  1747.                      if(wert > anzahl)
  1748.                         return(TRUE);
  1749.                      break;
  1750.                   default:
  1751.                      error = 63;
  1752.                      return(FALSE);
  1753.                }
  1754.             }
  1755.             i = 1;
  1756.          }
  1757.  
  1758.          anzahl = pseudo = 0;
  1759.          define = FALSE;
  1760.          if(!printline())
  1761.             return(FALSE);
  1762.          do
  1763.          {
  1764.             if(pseudo == 5)
  1765.                anzahl++;
  1766.             if(pseudo == 7)
  1767.                anzahl--;
  1768.             if(!getline())
  1769.                return(FALSE);
  1770.             if(!divideline())
  1771.                return(FALSE);
  1772.             if(!printline())
  1773.                return(FALSE);
  1774.             if(pseudo == 8)
  1775.             {
  1776.                if(!dopseudos())
  1777.                   return(FALSE);
  1778.                continue;
  1779.             }
  1780.          } while(anzahl || ((i) ? ((pseudo != 6) && (pseudo != 7)) :
  1781.                                    (pseudo != 7)));
  1782.          define = TRUE;
  1783.          return(TRUE);
  1784.       }
  1785.       case 8: /* .APPEND */
  1786.       {
  1787.          Close(SourceHandle);
  1788.          SourceHandle = 0L;
  1789.          if(!operand[0][0])
  1790.          {
  1791.             error = 9;
  1792.             return(FALSE);
  1793.          }
  1794.          strcpy(actname, operand[0]);
  1795.          if(!(SourceHandle = (struct FileHandle *)
  1796.             Open(actname, (ULONG)MODE_OLDFILE)))
  1797.          {
  1798.             error = 1;
  1799.             return(FALSE);
  1800.          }
  1801.          lines = 0L;
  1802.          if(!readbuffer())
  1803.             return(FALSE);
  1804.          if(!printline())
  1805.             return(FALSE);
  1806.          if(!printnames())
  1807.             return(FALSE);
  1808.          return(TRUE);
  1809.       }
  1810.       case 9: /* .MACRO / .ENDMACRO */
  1811.       {
  1812.          if(pass != 1)
  1813.          {
  1814.             if(!printline())
  1815.                return(FALSE);
  1816.             printed = FALSE;
  1817.             while(pseudo != 10)
  1818.             {
  1819.                if(!getline())
  1820.                {
  1821.                   error = 13;
  1822.                   return(FALSE);
  1823.                }
  1824.                if(!divideline())
  1825.                   return(FALSE);
  1826.                if(pseudo == 8)
  1827.                {
  1828.                   if(!dopseudos())
  1829.                      return(FALSE);
  1830.                   continue;
  1831.                }
  1832.             }
  1833.             return(TRUE);
  1834.          }
  1835.  
  1836.          define = FALSE;
  1837.          if(!operand[0][0])
  1838.          {
  1839.             error = 10;
  1840.             return(FALSE);
  1841.          } 
  1842.          if(((macronumber+1) * sizeof(struct Macro)) > Einst.macrotablelenght)
  1843.          {
  1844.             error = 11;
  1845.             return(FALSE);
  1846.          }
  1847.          if(searchmacro(operand[0]) != macronumber)
  1848.          {
  1849.             error = 65;
  1850.             return(FALSE);
  1851.          }
  1852.          zeiger = operand[1];
  1853.          wert = getstatement();
  1854.          if(wert > 10)
  1855.          {
  1856.             error = 42;
  1857.             return(FALSE);
  1858.          }
  1859.          MacroTable[macronumber].paramcount = (char)wert;
  1860.          if(nerror)
  1861.             return(FALSE);
  1862.          MacroTable[macronumber].source = macroup;
  1863.          strcpy(MacroTable[macronumber].name, operand[0]);
  1864.          MacroTable[macronumber].aufruf = 0;
  1865.          i = 0;
  1866.          workbuffer[i] = 0;
  1867.          if(!printline())
  1868.             return(FALSE);
  1869.          printed = FALSE;
  1870.          while((macroup-MacroMem) < Einst.macromemlenght)
  1871.          {
  1872.             if(!workbuffer[i])
  1873.             {
  1874.                i = 0;
  1875.                if(!getline())
  1876.                {
  1877.                   error = 13;
  1878.                   return(FALSE);
  1879.                }
  1880.                if(!divideline())
  1881.                   return(FALSE);
  1882.                if(pseudo == 10)
  1883.                   break;
  1884.                if(pseudo == 9)
  1885.                {
  1886.                   error = 14;
  1887.                   return(FALSE);
  1888.                }
  1889.                if(pseudo == 4)
  1890.                {
  1891.                   error = 19;
  1892.                   return(FALSE);
  1893.                }
  1894.                if(pseudo == 8)
  1895.                {
  1896.                   if(!dopseudos())
  1897.                      return(FALSE);
  1898.                   continue;
  1899.                }
  1900.             }
  1901.             *macroup = workbuffer[i];
  1902.             macroup++;
  1903.             i++;
  1904.             if(!workbuffer[i])
  1905.             {
  1906.                *macroup = 0x0a;
  1907.                macroup++;
  1908.             }
  1909.          }
  1910.          if((macroup-MacroMem) == Einst.macromemlenght)
  1911.          {
  1912.             error = 12;
  1913.             return(FALSE);
  1914.          }
  1915.          MacroTable[macronumber].lenght = macroup -
  1916.                                           MacroTable[macronumber].source;
  1917.          macronumber++;
  1918.          actmacro = macronumber;
  1919.          define = TRUE;
  1920.          return(TRUE);
  1921.       }
  1922.       case 10: /* .ENDMACRO (ohne .MACRO !) */
  1923.       {
  1924.          error = 38;
  1925.          return(FALSE);
  1926.       }
  1927.       case 11: /* .BLOCK */
  1928.       {
  1929.          zeiger = operand[0];
  1930.          anzahl = getstatement();
  1931.          zeiger = operand[1];
  1932.          wert = getstatement();
  1933.          if(wert > 255)
  1934.          {
  1935.             error = 30;
  1936.             return(FALSE);
  1937.          }
  1938.          linelenght = 0;
  1939.          if(pass == 2)
  1940.          {
  1941.             while(anzahl > 3)
  1942.             {
  1943.                zeile[0] = (unsigned char)wert;
  1944.                linelenght = 1;
  1945.                if(!outbytes())
  1946.                   return(FALSE);
  1947.                pc++;
  1948.                anzahl--;
  1949.             }
  1950.             linelenght = anzahl;
  1951.             for(;anzahl > 0;anzahl--)
  1952.                zeile[anzahl-1] = (unsigned char)wert;
  1953.          }
  1954.          else
  1955.             pc += anzahl;
  1956.          return(TRUE);
  1957.       }
  1958.       case 12: /* .ASCII */
  1959.       {
  1960.          zeiger = operand[0];
  1961.          linelenght = 0;
  1962.          while(*zeiger)
  1963.          {
  1964.             zeile[linelenght] = Einst.converttable[*zeiger];
  1965.             linelenght++;
  1966.             zeiger++;
  1967.          }
  1968.          return(TRUE);
  1969.       }
  1970.    }
  1971. }
  1972.  
  1973. /*******************
  1974.  * Macro ausführen *
  1975.  *******************/
  1976.  
  1977. BOOL domacro()
  1978. {
  1979.    register char i;
  1980.    /* unsigned int wert; not used */
  1981.    struct MacroStack help;
  1982.  
  1983.    if(MacroPointer == &MacroStack[32])
  1984.    {
  1985.       error = 15;
  1986.       return(FALSE);
  1987.    }
  1988.    MacroPointer->pointer = actposition;
  1989.    for(i=0;i<10;i++)
  1990.    {
  1991.       MacroPointer->params[i] = params[i];
  1992.       MacroPointer->defd[i] = defd[i];
  1993.       help.params[i] = 0;
  1994.       help.defd[i] = FALSE;
  1995.    }
  1996.    MacroPointer->lineafter = lines;
  1997.    MacroPointer->endbuffer = (char *)endbuffer;
  1998.    MacroPointer->actlenght = actlenght;
  1999.    MacroPointer->paramcount = paramcount;
  2000.    MacroPointer->number = actmacro;
  2001.    MacroPointer->aufruf = aufruf;
  2002.    MacroPointer++;
  2003.    actposition = MacroTable[macro].source;
  2004.    actlenght = MacroTable[macro].lenght;
  2005.    endbuffer = actposition + actlenght;
  2006.    help.paramcount = MacroTable[macro].paramcount;
  2007.    MacroTable[macro].aufruf++;
  2008.    aufruf = MacroTable[macro].aufruf;
  2009.    for(i=0; i<help.paramcount; i++)
  2010.    {
  2011.       if(!operand[i][0])
  2012.       {
  2013.          error = 25;
  2014.          return(FALSE);
  2015.       }
  2016.       zeiger = operand[i];
  2017.       help.params[i] = (unsigned int)getstatement();
  2018.       help.defd[i] = TRUE;
  2019.       if(nerror)
  2020.       {
  2021.          if((pass == 1) && (error == 24))
  2022.          {
  2023.             help.defd[i] = FALSE;
  2024.             nerror = FALSE;
  2025.             error = 255;
  2026.          }
  2027.          else
  2028.             return(FALSE);
  2029.       }
  2030.    }
  2031.    paramcount = help.paramcount;
  2032.    for(i=0; i<10; i++)
  2033.    {
  2034.       params[i] = help.params[i];
  2035.       defd[i] = help.defd[i];
  2036.    }
  2037.    actmacro = macro;
  2038.    lines = 0L;
  2039.    return(TRUE);
  2040. }
  2041.  
  2042. /******************************
  2043.  * Adressierungsart ermitteln *
  2044.  ******************************/
  2045.  
  2046. int adress()
  2047. {
  2048.    register int i = 0, num = 0, lenght = 0;
  2049.    char akt[4];
  2050.    BOOL dif = TRUE;
  2051.    
  2052.    if(!operand[0][0]) /* akku/implement */
  2053.       return(11);
  2054.  
  2055.    if(operand[0][0] == '#') /* immediate */
  2056.    {
  2057.       operand[0][0] = ' ';
  2058.       return(0);
  2059.    }
  2060.  
  2061.    lenght = strlen(operand[0])-1;
  2062.    akt[0] = operand[0][0];
  2063.    akt[1] = operand[0][lenght-2];
  2064.    akt[2] = operand[0][lenght-1];
  2065.    akt[3] = operand[0][lenght];
  2066.  
  2067.    while((num<5) && dif)
  2068.    {
  2069.       dif = FALSE;
  2070.       i = 0;
  2071.       while((i<4) && !dif)
  2072.       {
  2073.          if(addr[num][i] != 255)
  2074.             if(addr[num][i] != akt[i])
  2075.                dif = TRUE;
  2076.          i++;
  2077.       }
  2078.       num++;
  2079.    }
  2080.    if(dif)
  2081.       return(4);
  2082.    else
  2083.    {
  2084.       num--;
  2085.       if(addr[num][0] != 255)
  2086.          operand[0][0] = ' ';
  2087.       for(i=0;i<3;i++)
  2088.       {
  2089.          if(addr[num][i+1] != 255)
  2090.             operand[0][lenght-2+i] = '\0';
  2091.       }
  2092.       return(addr[num][4]);
  2093.    }
  2094. }
  2095.  
  2096. /**********************
  2097.  * Zeile assemblieren *
  2098.  **********************/
  2099.  
  2100. BOOL assline()
  2101. {
  2102.    register unsigned int oper = 0, adr;
  2103.  
  2104.    adr = adress();
  2105.    zeiger = operand[0];
  2106.    if((*zeiger == ' ') || (*zeiger == '!'))
  2107.       zeiger++;
  2108.    nerror = FALSE;
  2109.    oper = ((adr < 4) && (adr > 6) && (pass == 1)) ? 0 : getstatement();
  2110.    if(nerror)
  2111.    {
  2112.       if((pass != 1) || (error != 24))
  2113.          return(FALSE);
  2114.       else
  2115.       {
  2116.          error = 255;
  2117.          oper = 65535;
  2118.       }
  2119.    }
  2120.    if((oper > 255) || (operand[0][0] == '!'))
  2121.    {
  2122.       switch(adr)
  2123.       {
  2124.          case 4:
  2125.             adr = 1;
  2126.             if(opcodes[mnemonic][adr] == 0xff)
  2127.                adr = 9;
  2128.             break;
  2129.          case 5:
  2130.             adr = 2;
  2131.             break;
  2132.          case 6:
  2133.             adr = 3;
  2134.             break;
  2135.          case 0:
  2136.          case 7:
  2137.          case 8:
  2138.             if(pass == 2)
  2139.             {
  2140.                error = 30;
  2141.                return(FALSE);
  2142.             }
  2143.       }
  2144.    }
  2145.    else
  2146.    {
  2147.       if((adr == 4) && (opcodes[mnemonic][adr] == 0xff))
  2148.          if(opcodes[mnemonic][1] == 0xff)
  2149.             adr = 9;
  2150.          else
  2151.             adr = 1;
  2152.    }
  2153.  
  2154.    if(opcodes[mnemonic][adr] == 0xff)
  2155.    {
  2156.       error = 31;
  2157.       return(FALSE);
  2158.    }
  2159.    linelenght = laenge[adr];
  2160.    over = oper;
  2161.    aver = adr;
  2162.    return(TRUE);
  2163. }
  2164.  
  2165. /*******************************
  2166.  * Opcodes für Zeile erstellen *
  2167.  *******************************/
  2168.  
  2169. BOOL makebytes()
  2170. {
  2171.    zeile[0] = opcodes[mnemonic][aver];
  2172.    if(aver == 11)
  2173.       return(TRUE);
  2174.    if(aver != 9)
  2175.    {
  2176.       zeile[1] = (unsigned char)(over - 256 * (over / 256));
  2177.       zeile[2] = (unsigned char)(over / 256);
  2178.    }
  2179.    else
  2180.    {
  2181.       if((over > (pc+2)) ? ((over-pc)>129) : ((pc-over)>126))
  2182.       {
  2183.          error = 33;
  2184.          return(FALSE);
  2185.       }
  2186.       zeile[1] = (unsigned char)(over - (pc + 2));
  2187.    }
  2188.    return(TRUE);
  2189. }
  2190.  
  2191. /**********************************
  2192.  * Bytes in Objektdatei speichern *
  2193.  **********************************/
  2194.  
  2195. BOOL outbytes()
  2196. {
  2197.    register char i = 0;
  2198.  
  2199.    while(i<linelenght)
  2200.    {
  2201.       outbuffer[pos] = zeile[i];
  2202.       pos++;
  2203.       if(pos == 512)
  2204.       {
  2205.          if(!ObjectHandle)
  2206.          {
  2207.             error = 40;
  2208.             return(FALSE);
  2209.          }
  2210.          if(Write(ObjectHandle, outbuffer, 512L) != 512L)
  2211.          {
  2212.             error = 35;
  2213.             return(FALSE);
  2214.          }
  2215.          pos = 0;
  2216.       }
  2217.       i++;
  2218.    }
  2219.    return(TRUE);
  2220. }
  2221.  
  2222. /*****************************
  2223.  * Einstellungen abspeichern *
  2224.  *****************************/
  2225.  
  2226. BOOL saveeinst()
  2227. {
  2228.    struct FileHandle *EinstHandle;
  2229.  
  2230.    error = 54;
  2231.    refreshstatus();
  2232.    error = 255;
  2233.    if(!(EinstHandle = (struct FileHandle *)
  2234.       Open("s:CA.prefs", MODE_NEWFILE)))
  2235.    {
  2236.       error = 44;
  2237.       return(FALSE);
  2238.    }
  2239.    if(Write(EinstHandle, &Einst, (long)sizeof(struct Einstellungen)) !=
  2240.       (long)sizeof(struct Einstellungen))
  2241.    {
  2242.       error = 44;
  2243.       Close(EinstHandle);
  2244.       return(FALSE);
  2245.    }
  2246.    Close(EinstHandle);
  2247.    return(TRUE);
  2248. }
  2249.  
  2250. /*******************************
  2251.  * Konvertierungstabelle laden *
  2252.  *******************************/
  2253.  
  2254. BOOL getname();
  2255. BOOL loadkonverttable()
  2256. {
  2257.    unsigned char konvtable[256], num[2][128];
  2258.    unsigned int i, u;
  2259.    unsigned long number1, number2;
  2260.  
  2261.    konvtable[0] = '\0';
  2262.    if(!getname("Name der Konvertierungstabelle:", konvtable))
  2263.       return(FALSE);
  2264.    error = 52;
  2265.    refreshstatus();
  2266.    error = 255;
  2267.    MacroPointer = MacroStack;
  2268.    IncludePointer = IncludeStack;
  2269.    strcpy(IncludePointer->lastfile, dateistrbuffer);
  2270.    IncludePointer->lineafter = 0L;
  2271.    IncludePointer++;
  2272.    endbuffer = (LONG) mainbuffer;
  2273.    actposition = (char *)endbuffer;
  2274.    actlenght = 0L;
  2275.    *mainbuffer = 0;
  2276.  
  2277.    while(getline())
  2278.    {
  2279.       num[0][0] = num[1][0] = '\0';
  2280.       zeiger = workbuffer;
  2281.       if(*zeiger == ';')
  2282.          continue;
  2283.       for(i=0; i<2; i++)
  2284.       {
  2285.          while((*zeiger == ' ') || (*zeiger == 0x09))
  2286.             zeiger++;
  2287.          u = 0;
  2288.          while((*zeiger != ' ') && (*zeiger != 0x09) && (*zeiger))
  2289.          {
  2290.             num[i][u] = *zeiger;
  2291.             u++;
  2292.             zeiger++;
  2293.          }
  2294.          num[i][u] = '\0';
  2295.       }
  2296.       zeiger = num[0];
  2297.       number1 = getnumber();
  2298.       if(nerror)
  2299.          break;
  2300.       zeiger = num[1];
  2301.       number2 = getnumber();
  2302.       if(nerror)
  2303.          break;
  2304.       for(i=(unsigned int)number1; i<256; i++, number2++)
  2305.          Einst.converttable[i] = (unsigned char)number2;
  2306.    }
  2307.    if(SourceHandle)
  2308.       Close(SourceHandle);
  2309.    SourceHandle = 0L;
  2310.    actname[0] = '\0';
  2311.    lines = completelines = 0L;
  2312.    return(TRUE);
  2313. }
  2314.  
  2315. /***********************
  2316.  * Einstellungen laden *
  2317.  ***********************/
  2318.  
  2319. BOOL loadeinst()
  2320. {
  2321.    struct FileHandle *EinstHandle;
  2322.  
  2323.    error = 53;
  2324.    refreshstatus();
  2325.    error = 255;
  2326.    if(!(EinstHandle = (struct FileHandle *)
  2327.       Open("s:CA.prefs", MODE_OLDFILE)))
  2328.    {
  2329.       error = 45;
  2330.       return(FALSE);
  2331.    }
  2332.    if(Read(EinstHandle, &Einst, (long)sizeof(struct Einstellungen)) !=
  2333.       (long)sizeof(struct Einstellungen))
  2334.    {
  2335.       error = 45;
  2336.       Close(EinstHandle);
  2337.       return(FALSE);
  2338.    }
  2339.    Close(EinstHandle);
  2340.    return(TRUE);
  2341. }
  2342.  
  2343. /******************************************
  2344.  * Pass 1 : Labeldefinitionen durchführen *
  2345.  ******************************************/
  2346.  
  2347. void passone()
  2348. {
  2349.    register unsigned int oldmacro = 0, dejafait = 0;
  2350.    struct Message *GetMsg();
  2351.    struct IntuiMessage *message;
  2352.    ULONG MessageClass;
  2353.  
  2354.    SourceHandle = 0L;
  2355.    MacroPointer = MacroStack;
  2356.    IncludePointer = IncludeStack;
  2357.    strcpy(IncludePointer->lastfile, srcname);
  2358.    IncludePointer->lineafter = 0L;
  2359.    IncludePointer++;
  2360.    endbuffer = (LONG) mainbuffer;
  2361.    actposition = (char *)endbuffer;
  2362.    *mainbuffer = 0;
  2363.    actlenght = 0L;
  2364.    macroup = MacroMem;
  2365.    labelnumber = 0L;
  2366.    macronumber = blockcounter = actmacro = 0;
  2367.    paramcount = 0;
  2368.    for(oldmacro = 0; oldmacro < 10; oldmacro++)
  2369.       params[oldmacro] = 0;
  2370.    aufruf = 0;
  2371.    oldmacro = 0;
  2372.  
  2373.    pass = 1;
  2374.    completelines = lines = 0L;
  2375.    start = pc = 0xc000;
  2376.    define = TRUE;
  2377.    refreshstatus();
  2378.  
  2379.    FOREVER
  2380.    {
  2381.       if(dejafait == Einst.delay)
  2382.       {
  2383.          dejafait = 0;
  2384.          refreshstatus();
  2385.          if(message = (struct IntuiMessage *)
  2386.             GetMsg(MainWindow->UserPort))
  2387.          {
  2388.             MessageClass = message->Class;
  2389.             ReplyMsg(message);
  2390.             if(MessageClass == GADGETUP)
  2391.             {
  2392.                error = 37;
  2393.                break;
  2394.             }
  2395.          }
  2396.       }
  2397.       dejafait++;
  2398.       linelenght = 0;
  2399.       if(!getline())
  2400.          break;
  2401.       if(!divideline())
  2402.          break;
  2403.       oldmacro = macronumber;
  2404.       if(pseudo != PSEUDOS)
  2405.       {
  2406.          if(!dopseudos())
  2407.             break;
  2408.          pc += linelenght;
  2409.       }
  2410.       if(mnemonic != MNEMONICS)
  2411.       {
  2412.          if(!assline())
  2413.             break;
  2414.          pc += linelenght;
  2415.       }
  2416.       if(macro != oldmacro)
  2417.          if(!domacro())
  2418.             break;
  2419.    }
  2420.    remarkblock();
  2421. }
  2422.  
  2423. /**************************************************
  2424.  * Pass 2 : Eigentliche Assemblierung durchführen *
  2425.  **************************************************/
  2426.  
  2427. void passtwo()
  2428. {
  2429.    register unsigned int i = 0, dejafait = 0;
  2430.    struct Message *GetMsg();
  2431.    struct IntuiMessage *message;
  2432.    ULONG MessageClass;
  2433.    char pstring[320];
  2434.    unsigned int oldpc;
  2435.  
  2436.    SourceHandle = ObjectHandle = 0L;
  2437.    MacroPointer = MacroStack;
  2438.    IncludePointer = IncludeStack;
  2439.    strcpy(IncludePointer->lastfile, srcname);
  2440.    IncludePointer->lineafter = 0L;
  2441.    IncludePointer++;
  2442.    endbuffer = (LONG) mainbuffer;
  2443.    actposition = (char *)endbuffer;
  2444.    *mainbuffer = 0;
  2445.    actlenght = 0L;
  2446.    paramcount = pos = 0;
  2447.    objname[0] = '\0';
  2448.    for(i = 0; i < 10; i++)
  2449.       params[i] = 0;
  2450.    aufruf = 0;
  2451.    for(i = 0; i < macronumber; i++)
  2452.       MacroTable[i].aufruf = 0;
  2453.  
  2454.    pass = 2;
  2455.    completelines = lines = 0L;
  2456.    pc = start;
  2457.    define = TRUE;
  2458.    refreshstatus();
  2459.  
  2460.    FOREVER
  2461.    {
  2462.       printed = FALSE;
  2463.       if(dejafait == Einst.delay)
  2464.       {
  2465.          dejafait = 0;
  2466.          refreshstatus();
  2467.          if(message = (struct IntuiMessage *)
  2468.             GetMsg(MainWindow->UserPort))
  2469.          {
  2470.             MessageClass = message->Class;
  2471.             ReplyMsg(message);
  2472.             if(MessageClass == GADGETUP)
  2473.             {
  2474.                error = 37;
  2475.                break;
  2476.             }
  2477.          }
  2478.       }
  2479.       dejafait++;
  2480.       linelenght = 0;
  2481.       oldpc = pc;
  2482.       if(!getline())
  2483.          break;
  2484.       if(!divideline())
  2485.          break;
  2486.       if(pseudo != PSEUDOS)
  2487.       {
  2488.          if(!dopseudos())
  2489.             break;
  2490.          pc += linelenght;
  2491.          if(!outbytes())
  2492.             break;
  2493.       }
  2494.       if(mnemonic != MNEMONICS)
  2495.       {
  2496.          if(!assline())
  2497.             break;
  2498.          if(!makebytes())
  2499.             break;
  2500.          pc += linelenght;
  2501.          if(!outbytes())
  2502.             break;
  2503.       }
  2504.       if(macro != macronumber)
  2505.       {
  2506.          if(!domacro())
  2507.             break;
  2508.       }
  2509.       if(prtflag && !printed)
  2510.       {
  2511.          sprintf(pstring, "%7lu : %04x ", completelines, oldpc);
  2512.          for(i=0; i<((linelenght > 3) ? 3 : linelenght); i++)
  2513.             sprintf(&pstring[15+i*3], "%02x ", zeile[i]);
  2514.          for(;i<3;i++)
  2515.             sprintf(&pstring[15+i*3], "   ");
  2516.          sprintf(&pstring[24], "%s\n", workbuffer);
  2517.          if((Write(PrintHandle, pstring, (long)strlen(pstring))) !=
  2518.             (long)strlen(pstring))
  2519.          {
  2520.             error = 60;
  2521.             break;
  2522.          }
  2523.       }
  2524.    }
  2525.    if(error == 255)
  2526.    {
  2527.       if(ObjectHandle)
  2528.       {
  2529.          if(Write(ObjectHandle, outbuffer, (long)pos) != (long)pos)
  2530.             error = 36;
  2531.       }
  2532.       else
  2533.          error = 40;
  2534.    }
  2535.    if(ObjectHandle)
  2536.    {
  2537.       Close(ObjectHandle);
  2538.       ObjectHandle = 0L;
  2539.    }
  2540. }
  2541.  
  2542. /**********************
  2543.  * Informationswindow *
  2544.  **********************/
  2545.  
  2546. BOOL information()
  2547. {
  2548.    struct Window *InfoWindow;
  2549.    struct Message *GetMsg();
  2550.    struct IntuiMessage *message;
  2551.  
  2552.    sprintf(InfoText5.IText, "       Labeltabelle:  %8lu Byte", Einst.labellenght);
  2553.    sprintf(InfoText6.IText, "       Makrotabelle:  %8lu Byte", Einst.macrotablelenght);
  2554.    sprintf(InfoText7.IText, "       Makrospeicher: %8lu Byte", Einst.macromemlenght);
  2555.  
  2556.    InfoNewWindow.LeftEdge = MainWindow->LeftEdge+20;
  2557.    InfoNewWindow.TopEdge = MainWindow->TopEdge+5;
  2558.  
  2559.    if(!(InfoWindow = (struct Window *)
  2560.       OpenWindow(&InfoNewWindow)))
  2561.    {
  2562.       error = 43;
  2563.       return(FALSE);
  2564.    }
  2565.    PrintIText(InfoWindow->RPort, &InfoText1, 0L, 0L);
  2566.    DrawBorder(InfoWindow->RPort, &InfoBorder1, 0L, 0L);
  2567.    WaitPort(InfoWindow->UserPort);
  2568.    message = (struct IntuiMessage *)GetMsg(InfoWindow->UserPort);
  2569.    ReplyMsg(message);
  2570.    CloseWindow(InfoWindow);
  2571.    return(TRUE);
  2572. }
  2573.  
  2574. /*********************
  2575.  * Dateinameneingabe *
  2576.  *********************/
  2577.  
  2578. BOOL getname(uebersch, string)
  2579. char *uebersch, *string;
  2580. {
  2581.    struct Window *DateiWindow;
  2582.    struct Message *GetMsg();
  2583.    struct IntuiMessage *message;
  2584.    USHORT MessageClass;
  2585.  
  2586.    if (OS20)
  2587.    {
  2588.       if (DateiReq(string,uebersch,"~(#?.info)"))
  2589.       {  strcpy(dateistrbuffer,string);
  2590.          return TRUE;
  2591.       }
  2592.       else
  2593.          return FALSE;
  2594.    }
  2595.  
  2596.    DateiNewWindow.LeftEdge = MainWindow->LeftEdge+12;
  2597.    DateiNewWindow.TopEdge = MainWindow->TopEdge+56;
  2598.  
  2599.    DateiText1.IText = uebersch;
  2600.    strcpy(dateistrbuffer, string);
  2601.    DateiStringInfo.BufferPos = strlen(string);
  2602.  
  2603.    if(!(DateiWindow = (struct Window *)
  2604.       OpenWindow(&DateiNewWindow)))
  2605.    {
  2606.       error = 43;
  2607.       return(FALSE);
  2608.    }
  2609.    PrintIText(DateiWindow->RPort, &DateiText1, 0L, 0L);
  2610.    ActivateGadget(&DateiGadget1, DateiWindow, NULL);
  2611.    WaitPort(DateiWindow->UserPort);
  2612.    message = GetMsg(DateiWindow->UserPort);
  2613.    MessageClass = message->Class;
  2614.    ReplyMsg(message);
  2615.    CloseWindow(DateiWindow);
  2616.    return((MessageClass & GADGETUP) ? TRUE : FALSE);
  2617. }
  2618.  
  2619. /**************************
  2620.  * Objektdatei übertragen *
  2621.  **************************/
  2622.  
  2623. BOOL transfer()
  2624. {
  2625.    struct FileHandle *ParHandle = 0L;
  2626.    unsigned long lenght = 512L;
  2627.  
  2628.    error = 255;
  2629.    if(!getname("Zu übertragende Datei:", objname))
  2630.       return(FALSE);
  2631.  
  2632.    if(!(ObjectHandle = (struct FileHandle *)
  2633.       Open(dateistrbuffer, MODE_OLDFILE)))
  2634.    {
  2635.       error = 34;
  2636.       return(FALSE);
  2637.    }
  2638.    if(!(ParHandle = (struct FileHandle *)
  2639.       Open("par:", MODE_OLDFILE)))
  2640.    {
  2641.       error = 46;
  2642.       return(FALSE);
  2643.    }
  2644.    error = 49;
  2645.    refreshstatus();
  2646.    error = 255;
  2647.    while(lenght == 512L)
  2648.    {
  2649.       lenght = Read(ObjectHandle, outbuffer, 512L);
  2650.       if(IoErr() > 100)
  2651.       {
  2652.          error = 47;
  2653.          break;
  2654.       }
  2655.       if(Write(ParHandle, outbuffer, lenght) != lenght)
  2656.       {
  2657.          error = 48;
  2658.          break;
  2659.       }
  2660.    }
  2661.    Close(ObjectHandle);
  2662.    Close(ParHandle);
  2663.    return((error == 255) ? TRUE : FALSE);
  2664. }
  2665.  
  2666. /***********************
  2667.  * Source-Code drucken *
  2668.  ***********************/
  2669.  
  2670. BOOL printsource()
  2671. {
  2672.    prtflag = (prtflag) ? FALSE : TRUE;
  2673.    if(prtflag)
  2674.    {
  2675.       if(!(getname("Druckdatei:", prtname)))
  2676.       {
  2677.          prtflag = FALSE;
  2678.          return(FALSE);
  2679.       }
  2680.       strcpy(prtname, dateistrbuffer);
  2681.       error = 57;
  2682.    }
  2683.    else
  2684.       error = 58;
  2685.    return(FALSE);
  2686. }
  2687.  
  2688. /***********************
  2689.  * Tabellen ausdrucken *
  2690.  ***********************/
  2691.  
  2692. BOOL printtabs(number)
  2693. char number;
  2694. {
  2695.    char pstring[100], pstring2[100], pstring3[100];
  2696.    register unsigned long counter, end;
  2697.  
  2698.    if(!(getname("Druckdatei:", prtname)))
  2699.       return(FALSE);
  2700.    strcpy(prtname, dateistrbuffer);
  2701.    if(!(PrintHandle = append(prtname)))
  2702.       error = 59;
  2703.    error = 61;
  2704.    refreshstatus();
  2705.    pstring[0] = pstring2[0] = pstring3[0] = '\0';
  2706.    switch(number)
  2707.    {
  2708.       case 0:
  2709.          end = (unsigned long)labelnumber;
  2710.          sprintf(pstring, "\nLabeltabelle: %lu Einträge\n\n", (unsigned long)labelnumber);
  2711.          if(end)
  2712.          {
  2713.             strcpy(pstring2, "Labelname                         dez.   hex.\n");
  2714.             strcpy(pstring3, "---------------------------------------------\n");
  2715.          }
  2716.          break;
  2717.       case 1:
  2718.          end = (unsigned long)macronumber;
  2719.          sprintf(pstring, "\nMakrotabelle: %lu Einträge\n\n", (unsigned long)macronumber);
  2720.          if(end)
  2721.          {
  2722.             strcpy(pstring2, "Makroname                         Länge  Parameter\n");
  2723.             strcpy(pstring3, "--------------------------------------------------\n");
  2724.          }
  2725.          break;
  2726.       case 2:
  2727.          end = (unsigned long)blockcounter;
  2728.          sprintf(pstring, "\nBlocktabelle: %u Einträge\n\n", blockcounter);
  2729.          if(end)
  2730.          {
  2731.             strcpy(pstring2, "von    bis    von     bis    Länge  Dateinamen\n");
  2732.             strcpy(pstring3, "--------------------------------------------------------------------\n");
  2733.          }
  2734.          break;
  2735.    }
  2736.    if(((Write(PrintHandle, pstring, (long)strlen(pstring))) !=
  2737.       (long)strlen(pstring)) ||
  2738.       ((Write(PrintHandle, pstring2, (long)strlen(pstring2))) !=
  2739.       (long)strlen(pstring2)) ||
  2740.       ((Write(PrintHandle, pstring3, (long)strlen(pstring3))) !=
  2741.       (long)strlen(pstring3)))
  2742.    {
  2743.       error = 60;
  2744.       Close(PrintHandle);
  2745.       return(FALSE);
  2746.    }
  2747.    for(counter = 0L; counter<end; counter++)
  2748.    {
  2749.       switch(number)
  2750.       {
  2751.          case 0:
  2752.             sprintf(pstring, "%-32.32s  %5u  %04x\n",
  2753.                LabelTable[counter].name, LabelTable[counter].wert,
  2754.                LabelTable[counter].wert);
  2755.             break;
  2756.          case 1:
  2757.             sprintf(pstring, "%-32.32s  %5lu        %2u\n",
  2758.                MacroTable[counter].name, MacroTable[counter].lenght,
  2759.                MacroTable[counter].paramcount);
  2760.             break;
  2761.          case 2:
  2762.             sprintf(pstring, "%04x - %04x  %5u - %5u   %5u  %-32.32s\n",
  2763.                BlockTable[counter].begin, BlockTable[counter].end,
  2764.                BlockTable[counter].begin, BlockTable[counter].end,
  2765.                (BlockTable[counter].end-BlockTable[counter].begin),
  2766.                BlockTable[counter].name);
  2767.             break;
  2768.       }
  2769.       if((Write(PrintHandle, pstring, (long)strlen(pstring))) !=
  2770.          (long)strlen(pstring))
  2771.       {
  2772.          error = 60;
  2773.          Close(PrintHandle);
  2774.          return(FALSE);
  2775.       }
  2776.    }
  2777.    Close(PrintHandle);
  2778.    error = 255;
  2779.    return(TRUE);
  2780. }
  2781.  
  2782. /*******************************************************************
  2783.  * Labels alphabetisch sortieren (Algorithmus: Straight Insertion) *
  2784.  *******************************************************************/
  2785.  
  2786. char stricmp(a, b)
  2787. register char *a, *b;
  2788. {
  2789.    while(*a && (tolower(*a) == tolower(*b)))
  2790.    {
  2791.       a++;
  2792.       b++;
  2793.    }
  2794.    return(*a ? (tolower(*a) - tolower(*b)) : 0);
  2795. }
  2796.  
  2797. void sortthem()
  2798. {
  2799.    struct Label helplabel;
  2800.    register unsigned long i = 0L, j = 0L;
  2801.  
  2802.    error = 56;
  2803.    refreshstatus();
  2804.    if(labelnumber > 1L)
  2805.    {
  2806.       for(i=1L; i<labelnumber; i++)
  2807.       {
  2808.          if(stricmp(LabelTable[i].name, LabelTable[i-1L].name) < 0)
  2809.          {
  2810.             helplabel = LabelTable[i];
  2811.             for(j=i; j; j--)
  2812.             {
  2813.                LabelTable[j] = LabelTable[j-1L];
  2814.                if(stricmp(helplabel.name, LabelTable[j-2L].name) > 0)
  2815.                {
  2816.                   LabelTable[j-1L] = helplabel;
  2817.                   break;
  2818.                }
  2819.             }
  2820.          }
  2821.       }
  2822.    }
  2823.    error = 255;
  2824.    refreshstatus();
  2825. }
  2826.  
  2827. /****************************
  2828.  * Alle Texte neu schreiben *
  2829.  ****************************/
  2830.  
  2831. void redrawit(upper, number)
  2832. unsigned long upper;
  2833. USHORT number;
  2834. {
  2835.    register unsigned long i = 0;
  2836.    register int u;
  2837.  
  2838.    for(i=0; i<15; i++)
  2839.    {
  2840.       switch(number)
  2841.       {
  2842.          case 0:
  2843.             if((i+upper) < labelnumber)
  2844.                sprintf(TaText[i], "%-32.32s  %5u    $%04x",
  2845.                      LabelTable[i+upper].name, LabelTable[i+upper].wert,
  2846.                      LabelTable[i+upper].wert);
  2847.             else
  2848.                strcpy(TaText[i], "                                                 ");
  2849.             break;
  2850.          case 1:
  2851.             if((i+upper) < (unsigned long)macronumber)
  2852.                sprintf(TaText[i], "%-32.32s  %5lu        %2u",
  2853.                      MacroTable[i+upper].name, MacroTable[i+upper].lenght,
  2854.                      MacroTable[i+upper].paramcount);
  2855.             else
  2856.                strcpy(TaText[i], "                                                 ");
  2857.             break;
  2858.          case 2:
  2859.             if((i+upper) < (unsigned long)blockcounter)
  2860.                sprintf(TaText[i], "%04x-%04x  %5u %-32.32s",
  2861.                      BlockTable[i+upper].begin, BlockTable[i+upper].end,
  2862.                      (BlockTable[i+upper].end-BlockTable[i+upper].begin),
  2863.                      BlockTable[i+upper].name);
  2864.             else
  2865.                strcpy(TaText[i], "                                                 ");
  2866.             break;
  2867.          case 3:
  2868.             if((i+upper) < (unsigned long)MNEMONICS)
  2869.             {
  2870.                sprintf(TaText[i], "%3.3s                                              ",
  2871.                        mnemonics[i+upper]);
  2872.                for(u=0; u<12; u++)
  2873.                   TaText[i][5+u*4] = 
  2874.                      (opcodes[i+upper][u] == 0xff) ? ' ' : '*';
  2875.             }
  2876.             else
  2877.                strcpy(TaText[i], "                                                 ");
  2878.             break;
  2879.       }
  2880.    }
  2881. }
  2882.  
  2883. /***********************
  2884.  * Einstellungenwindow *
  2885.  ***********************/
  2886.  
  2887. BOOL doeinstellungen()
  2888. {
  2889.    struct Window *EinstWindow;
  2890.    struct Message *GetMsg();
  2891.    struct IntuiMessage *message;
  2892.    struct Einstellungen Ein;
  2893.    ULONG MessageClass = 0L, freechip = 0L, freefast = 0L;
  2894.    USHORT GadgetID = 0;
  2895.    BOOL refr = TRUE;
  2896.  
  2897.    Ein = Einst;
  2898.    sprintf(einst1strbuffer, "%lu", 
  2899.       (Einst1StringInfo.LongInt = Ein.labellenght/(long)sizeof(struct Label)));
  2900.    sprintf(einst2strbuffer, "%lu",
  2901.       (Einst1StringInfo.LongInt =  Ein.macrotablelenght/(long)sizeof(struct Macro)));
  2902.    sprintf(einst3strbuffer, "%lu", Ein.macromemlenght);
  2903.    sprintf(einst4strbuffer, "%u", Ein.delay);
  2904.    Einst1StringInfo.BufferPos = strlen(einst1strbuffer);
  2905.    Einst2StringInfo.BufferPos = strlen(einst2strbuffer);
  2906.    Einst3StringInfo.BufferPos = strlen(einst3strbuffer);
  2907.    Einst4StringInfo.BufferPos = strlen(einst4strbuffer);
  2908.    if(Ein.sort)
  2909.       EinstGadget6.Flags |= SELECTED;
  2910.    else
  2911.       EinstGadget6.Flags &= ~SELECTED;
  2912.    freechip = (unsigned long)AvailMem(MEMF_CHIP | MEMF_LARGEST);
  2913.    freefast = (unsigned long)AvailMem(MEMF_FAST | MEMF_LARGEST);
  2914.  
  2915.    if(!(EinstWindow = (struct Window *)
  2916.       OpenWindow(&EinstNewWindow)))
  2917.    {
  2918.       error = 43;
  2919.       return(FALSE);
  2920.    }
  2921.    PrintIText(EinstWindow->RPort, &EinstText4, 0L, 0L);
  2922.    ActivateGadget(&EinstGadget1, EinstWindow, NULL);
  2923.  
  2924.    while((MessageClass != CLOSEWINDOW) && (GadgetID != 5))
  2925.    {
  2926.       if(refr)
  2927.       {
  2928.          refr = FALSE;
  2929.          sprintf(EinstText4.IText, " = %8lu Byte", Ein.labellenght);
  2930.          sprintf(EinstText5.IText, " = %8lu Byte", Ein.macrotablelenght);
  2931.          PrintIText(EinstWindow->RPort, &EinstText4, 0L, 0L);
  2932.       }
  2933.       WaitPort(EinstWindow->UserPort);
  2934.       message = GetMsg(EinstWindow->UserPort);
  2935.       MessageClass = message->Class;
  2936.       GadgetID = (USHORT)(((struct Gadget *)(message->IAddress))->GadgetID);
  2937.       ReplyMsg(message);
  2938.  
  2939.       switch(GadgetID)
  2940.       {
  2941.          case 1:
  2942.             if(((Ein.labellenght = Einst1StringInfo.LongInt *
  2943.                        (long)sizeof(struct Label)) > freechip) &&
  2944.                 (Ein.labellenght > freefast))
  2945.                 Ein.labellenght = 0L;
  2946.             refr = TRUE;
  2947.             ActivateGadget(&EinstGadget2, EinstWindow, NULL);
  2948.             break;
  2949.          case 2:
  2950.             if(((Ein.macrotablelenght = Einst2StringInfo.LongInt *
  2951.                        (long)sizeof(struct Macro)) > freechip) &&
  2952.                 (Ein.labellenght > freefast))
  2953.                 Ein.labellenght = 0L;
  2954.             refr = TRUE;
  2955.             ActivateGadget(&EinstGadget3, EinstWindow, NULL);
  2956.             break;
  2957.          case 3:
  2958.             Ein.macromemlenght = Einst3StringInfo.LongInt;
  2959.             ActivateGadget(&EinstGadget4, EinstWindow, NULL);
  2960.             break;
  2961.          case 4:
  2962.             Ein.delay = (unsigned int)Einst4StringInfo.LongInt;
  2963.             ActivateGadget(&EinstGadget1, EinstWindow, NULL);
  2964.             break;
  2965.          case 6:
  2966.             Ein.sort = 1-Ein.sort;
  2967.             break;
  2968.       }
  2969.    }
  2970.    freeit();
  2971.    if(MessageClass != CLOSEWINDOW)
  2972.    {
  2973.       Einst.macromemlenght = Ein.macromemlenght;
  2974.       Einst.macrotablelenght = Ein.macrotablelenght;
  2975.       Einst.labellenght = Ein.labellenght;
  2976.       Einst.delay = Ein.delay;
  2977.       Einst.sort = Ein.sort;
  2978.    }
  2979.    labelnumber = 0L;
  2980.    macronumber = actmacro = 0;
  2981.    EinstNewWindow.LeftEdge = EinstWindow->LeftEdge;
  2982.    EinstNewWindow.TopEdge = EinstWindow->TopEdge;
  2983.    CloseWindow(EinstWindow);
  2984.    return(TRUE);
  2985. }
  2986.  
  2987. /******************
  2988.  * Tabellenwindow *
  2989.  ******************/
  2990.  
  2991. BOOL dotables(number)
  2992. USHORT number;
  2993. {
  2994.    struct Window *TableWindow;
  2995.    struct Gadget *ActG;
  2996.    struct Message *GetMsg();
  2997.    struct IntuiMessage *message;
  2998.    ULONG MessageClass;
  2999.    USHORT flag = 0;
  3000.    register int i;
  3001.    unsigned int quot;
  3002.    unsigned long max, upper, oldupper;
  3003.  
  3004.    TaProp1.VertPot = max = upper = 0;
  3005.    switch(number)
  3006.    {
  3007.       case 0:
  3008.          max = labelnumber;
  3009.          strcpy(TaText1.IText, "Labelname                         dez      hex    ");     
  3010.          break;
  3011.       case 1:
  3012.          max = (unsigned long)macronumber;
  3013.          strcpy(TaText1.IText, "Makroname                         Länge Parameter ");
  3014.          break;
  3015.       case 2:
  3016.          max = (unsigned long)blockcounter;    
  3017.          strcpy(TaText1.IText, "von  bis   Länge  Dateiname                       ");
  3018.          break;
  3019.       case 3:
  3020.          max = (unsigned long)MNEMONICS;
  3021.          strcpy(TaText1.IText, "    IM  AB  AX  AY  ZP  ZX  ZY  ID  DI  RE  IN  AI");
  3022.          break;
  3023.    }
  3024.    TaProp1.VertBody = (max < 16) ? 0xffff : (0xffff / max) * 15;
  3025.  
  3026.    if(!(TableWindow = (struct Window *)
  3027.       OpenWindow(&TableNewWindow)))
  3028.    {
  3029.       error = 43;
  3030.       return(FALSE);
  3031.    }
  3032.    DrawBorder(TableWindow->RPort, &TaBorder1, 0L, 0L);
  3033.    DrawBorder(TableWindow->RPort, &TaBorder3, 415L, 22L);
  3034.    DrawBorder(TableWindow->RPort, &TaBorder3, 415L, 138L);
  3035.    for(i=0; i<15; i++)
  3036.    {
  3037.       TaIntuiText[i] = TaTText;
  3038.       TaIntuiText[i].NextText = &TaIntuiText[i+1];
  3039.       TaIntuiText[i].TopEdge = 24 + i * 8;
  3040.       TaIntuiText[i].IText = TaText[i];
  3041.       TaText[i][0] = '\0';
  3042.    }
  3043.    TaIntuiText[14].NextText = NULL;
  3044.    redrawit(upper, number);
  3045.    PrintIText(TableWindow->RPort, &TaText1, 0L, 0L); 
  3046.    PrintIText(TableWindow->RPort, TaIntuiText, 0L, 0L);
  3047.  
  3048.    do
  3049.    {
  3050.       message = (struct IntuiMessage *)GetMsg(TableWindow->UserPort);
  3051.       if(!message && !flag)
  3052.       {
  3053.          Wait(1L << TableWindow->UserPort->mp_SigBit);
  3054.          continue;
  3055.       }
  3056.  
  3057.       if(message)
  3058.       {
  3059.          MessageClass = message->Class;
  3060.          ReplyMsg(message);
  3061.          if(MessageClass & GADGETDOWN)
  3062.          {
  3063.             ActG = message->IAddress;
  3064.             flag = ActG->GadgetID;
  3065.          }
  3066.          if((MessageClass & GADGETUP) || (MessageClass & CLOSEWINDOW))
  3067.             flag = 0;
  3068.       }
  3069.  
  3070.       if(flag && !((ActG->Flags) & SELECTED))
  3071.          flag = 0;
  3072.       oldupper = upper;
  3073.       quot = (0xffff/(max-15));
  3074.       switch(flag)
  3075.       {
  3076.          case 2:
  3077.             if((upper < (max-15L)) && (max > 15L))
  3078.             {
  3079.                upper++;
  3080.                TaProp1.VertPot = upper*quot;
  3081.                RefreshGadgets(&TaGadget3, TableWindow, NULL);
  3082.             }
  3083.             break;
  3084.          case 1:
  3085.             if(upper > 0)
  3086.             {
  3087.                upper--;
  3088.                TaProp1.VertPot = upper*quot;
  3089.                RefreshGadgets(&TaGadget3, TableWindow, NULL);
  3090.             }
  3091.             break;
  3092.       }
  3093.       if((upper * quot) != TaProp1.VertPot)
  3094.       {
  3095.             upper = (max < 16) ?
  3096.                   0 : TaProp1.VertPot/quot;
  3097.             if(((upper+15) > max) && (max > 15))
  3098.                upper = max-15;
  3099.       }
  3100.       if(upper != oldupper)
  3101.       {
  3102.          redrawit(upper, number);
  3103.          PrintIText(TableWindow->RPort, &TaText1, 0L, 0L); 
  3104.          PrintIText(TableWindow->RPort, TaIntuiText, 0L, 0L);
  3105.       }
  3106.    } while(!(MessageClass & CLOSEWINDOW));
  3107.    TableNewWindow.LeftEdge = TableWindow->LeftEdge;
  3108.    TableNewWindow.TopEdge = TableWindow->TopEdge;
  3109.    CloseWindow(TableWindow);
  3110.    return(TRUE);
  3111. }
  3112.  
  3113. /******************************
  3114.  * Menüauswertung durchführen *
  3115.  ******************************/
  3116.  
  3117. void domenus(menunumber)
  3118. USHORT menunumber;
  3119. {
  3120.    USHORT Menu, MenuItem;
  3121.  
  3122.    Menu = MENUNUM(menunumber);
  3123.    MenuItem = ITEMNUM(menunumber);
  3124.    error = 255;
  3125.  
  3126.    ClearMenuStrip(MainWindow);
  3127.    switch(Menu)
  3128.    {
  3129.       case 0: /* Datei-Menü */
  3130.          switch(MenuItem)
  3131.          {
  3132.             case 0: /* Übertragen */
  3133.                transfer();
  3134.                break;
  3135.             case 1: /* Information */
  3136.                information();
  3137.                break;
  3138.             case 2: /* Beenden */
  3139.                freeit();
  3140.                closeall();
  3141.                exit(TRUE);
  3142.          }
  3143.          break;
  3144.       case 1: /* Tabellen-Menü */
  3145.          dotables(MenuItem);
  3146.          break;
  3147.       case 2: /* Einstellungen-Menü */
  3148.          switch(MenuItem)
  3149.          {
  3150.             case 0: /* Ändern */
  3151.                doeinstellungen();
  3152.                break;
  3153.             case 1: /* Speichern */
  3154.                saveeinst();
  3155.                break;
  3156.             case 2: /* Laden */
  3157.                loadeinst();
  3158.                break;
  3159.             case 3: /* KonTab laden */
  3160.                loadkonverttable();
  3161.                break;
  3162.          }
  3163.          break;
  3164.       case 3: /* Drucken-Menü */
  3165.          if(!MenuItem)
  3166.             printsource(); /* Source-Code */
  3167.          else
  3168.             printtabs(MenuItem-1); /* Tabellen */
  3169.          break;
  3170.    }
  3171.    pass = 0;
  3172.    SetMenuStrip(MainWindow, &MenuDatei);
  3173.    if(error != 255)
  3174.       refreshstatus();
  3175. }
  3176.  
  3177. /*****************
  3178.  * Hauptschleife *
  3179.  *****************/
  3180.  
  3181. void mainloop()
  3182. {
  3183.    struct Message *GetMsg();
  3184.    struct IntuiMessage *message;
  3185.    ULONG MessageClass;
  3186.    USHORT code;
  3187.  
  3188.    refreshstatus();
  3189.    ClearMenuStrip(MainWindow);
  3190.    information();
  3191.    SetMenuStrip(MainWindow, &MenuDatei);
  3192.    srcname[0] = '\0';
  3193.  
  3194.    FOREVER
  3195.    {
  3196.       pass = 0;
  3197.       WaitPort(MainWindow->UserPort);
  3198.       message = GetMsg(MainWindow->UserPort);
  3199.       MessageClass = message->Class;
  3200.       code = message->Code;
  3201.       ReplyMsg(message);
  3202.       if(MessageClass & CLOSEWINDOW)
  3203.          break;
  3204.       if(MessageClass & GADGETUP)
  3205.       {
  3206.          ClearMenuStrip(MainWindow);
  3207.          if(!(getname((char *)"Quelldateiname:", srcname)))
  3208.          {
  3209.             SetMenuStrip(MainWindow, &MenuDatei);
  3210.             continue;
  3211.          }
  3212.          strcpy(srcname, dateistrbuffer); 
  3213.          objname[0] = '\0';
  3214.          Gadget1.GadgetText = &GadgetText2;
  3215.          RefreshGadgets(&Gadget1, MainWindow, NULL);
  3216.          freeit();
  3217.          if(init())
  3218.          {
  3219.             error = 255;
  3220.             run = TRUE;
  3221.             passone();
  3222.             if(prtflag)
  3223.             {
  3224.                if(!(PrintHandle = append(prtname)))
  3225.                   error = 59;
  3226.             }               
  3227.             if(error == 255)                  
  3228.                passtwo();
  3229.             run = FALSE;
  3230.             if(prtflag)
  3231.             {
  3232.                if(PrintHandle)
  3233.                   Close(PrintHandle);
  3234.             }
  3235.             if(SourceHandle)
  3236.                Close(SourceHandle);
  3237.             SourceHandle = 0L;
  3238.             if(((error == 255) || (error == 37)) && Einst.sort)
  3239.                sortthem();
  3240.             refreshstatus();
  3241.          }
  3242.          Gadget1.GadgetText = &GadgetText1;
  3243.          RefreshGadgets(&Gadget1, MainWindow, NULL);
  3244.          SetMenuStrip(MainWindow, &MenuDatei);
  3245.       }
  3246.       if(MessageClass & MENUPICK)
  3247.       {
  3248.          domenus(code);
  3249.          refreshstatus();
  3250.       }
  3251.    }
  3252. }
  3253.  
  3254. /*********************************************************
  3255.  * Aufruf des FileRequesters der ASL-Library in C        *
  3256.  *                                                       *
  3257.  * Datum           : 18. November 1990                   *
  3258.  * Autor           : David Göhler                        *
  3259.  * Version         : 1.1                                 *
  3260.  * Letzte Änderung : 18. November 1990                   *
  3261.  *                                                       *
  3262.  * Compilieren mit DICE: dcc filereq.c -o filereqdemo    *
  3263.  *                                                       *
  3264.  *********************************************************/
  3265.  
  3266.  
  3267. #define FILENAMELEN 256
  3268.  
  3269. struct Library *AslBase;
  3270.  
  3271.  
  3272. /* Syntax  : BOOL DateiReq(filename,AnzeigeText,Show)
  3273.  
  3274.   Datum   : 04. November 1989
  3275.  
  3276.   Eingabe : filename     - Zeiger auf den Filenamen
  3277.             AnzeigeText  - Zeiger auf Text, der oben im Window steht
  3278.             Show         - Ein String, der ein Pattern enthält. Der FileRequester
  3279.                            zeigt dann nur Dateien an, die auf das Pattern passen.
  3280.  
  3281.   Ausgabe : FALSE        - Requester mit Cancel verlassen
  3282.             TRUE         - neuer Dateiname ist gültig
  3283.  
  3284.   Funktion: Aufruf des 2.0-ASL-FileRequesters. Ein vereinfachtes Beispiel.
  3285.             Läuft nur unter 2.0
  3286. */
  3287.  
  3288. BOOL DateiReqD(char *filename,char *AnzeigeText,char *Show, BOOL dir)
  3289. {
  3290.   struct FileRequester *FR;
  3291.   char zwfile[FILENAMELEN];
  3292.   char zwdir [FILENAMELEN];
  3293.   char *cpoint,c;
  3294.   BOOL retcode = FALSE;
  3295.   ULONG extflags1;
  3296.  
  3297.   if (dir) extflags1 = FIL1F_NOFILES; else extflags1 = FIL1F_MATCHDIRS;
  3298.  
  3299.   if (AslBase = (struct Library *)OpenLibrary(AslName,37))
  3300.   {
  3301.      // String in filename und dirname aufteilen
  3302.      cpoint = PathPart(filename);
  3303.      c = *cpoint; *cpoint = '\0';
  3304.      strcpy(zwdir,filename);
  3305.      if (c=='/') {  *cpoint++=c; } else { *cpoint = c; }
  3306.      strcpy(zwfile,cpoint);
  3307.  
  3308.      if (FR = AllocAslRequestTags( ASL_FileRequest,
  3309.                                    ASL_Hail,         AnzeigeText,
  3310.                                    ASL_Window,       0L,
  3311.                                    ASL_File,         zwfile,
  3312.                                    ASL_Dir,          zwdir,
  3313.                                    ASL_FuncFlags,    FILF_PATGAD,
  3314.                                    ASL_ExtFlags1,    extflags1,
  3315.                                    ASL_Pattern,      Show,
  3316.                                    TAG_DONE ))
  3317.      {
  3318.         if (RequestFile(FR))
  3319.         {
  3320.            strcpy(filename,FR->rf_Dir);
  3321.            AddPart(filename,FR->rf_File,FILENAMELEN);
  3322.            retcode = TRUE;
  3323.         }
  3324.         FreeFileRequest(FR);
  3325.      }
  3326.      CloseLibrary((struct Library *)AslBase);
  3327.   }
  3328.   return retcode;
  3329. }
  3330.  
  3331. BOOL DateiReq(char *filename,char *AnzeigeText,char *Show)
  3332. {
  3333.     return DateiReqD(filename,AnzeigeText,Show,FALSE);
  3334. }
  3335.  
  3336.  
  3337. /*****************
  3338.  * Hauptprogramm *
  3339.  *****************/
  3340.  
  3341. void main()
  3342. {
  3343.    openall();
  3344.    mainloop();
  3345.    freeit();
  3346.    closeall();
  3347. }
  3348.  
  3349.  
  3350.  
  3351.